• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z klasą Scanner, Java 10

Object Storage Arubacloud
0 głosów
813 wizyt
pytanie zadane 3 grudnia 2018 w Java przez MarioB Nowicjusz (120 p.)
edycja 3 grudnia 2018 przez MarioB

Hej, pracuję nad programem który będzie kalkulatorem w konsoli, jak na razie wszystko dobrze, ale w momencie gdy chcę zapętlić jego działanie, wyskakuje mi NoSuchElementException

import java.util.InputMismatchException;
import java.util.Scanner;

public class Program {

        public static void main(String [] args){

            String info = "\n\nCo chcesz zrobić; \nDodawać? Wpisz 1\nOdejmować? Wpisz 2\nMnożyć? Wpisz 3\nDzielić? Wpisz 4\nPotęgować? Wpisz 5\n"

            String info2 = "\n\nCo chcesz zrobić; \nNastępne równanie? Wciśnij 1 \nWyjść z programu? Wciśnij 2";

            boolean error = true;
            Scanner input = new Scanner(System.in);

            while (error) {
                System.out.println(info);
                try {
                    int choice = input.nextInt();
                    switch (choice) {
                        case 1:
                            Addition addition = new Addition();
                            addition.add();
                            break;
                        case 2:
                            Subtraction subtraction = new Subtraction();
                            subtraction.sub();
                            break;
                        case 3:
                            Multiplication multiplication = new Multiplication();
                            multiplication.multi();
                            break;
                        case 4:
                            Division division = new Division();
                            division.div();
                            break;
                        case 5:
                            Exponentiation exponentiation = new Exponentiation();
                            exponentiation.exp();
                            break;
                    }
                    input.nextLine();
                    System.out.println(info2);
                    int choice2 = input.nextInt();
                    if(choice2 == 1) {
                        error = true;
                        break;
                    }else if(choice2 == 2){
                        error = false;
                        break;
                    }else{
                        System.out.println("Zły znak");
                    }
                }catch(InputMismatchException ex){
                    System.out.println("Podałeś zły znak, spróbuj jeszcze raz!");
                }
            }
            input.close();
        }
    }

Dokładniej konsola wskazuję na linijkę
 

int choice2 = input.nextInt();

Że to właśnie ona powoduje problem i wyrzucenie:

Exception in thread "main" java.util.NoSuchElementException
	at java.base/java.util.Scanner.throwFor(Scanner.java:937)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at Program.main(Program.java:44)

Czy byłby ktoś skory przybliżyć mi temat ograniczeń klasy Scanner? Obecnie sam nawet zaglądałem czy to w kod klasy i wskazane linijki czy w docs.oracle i chyba jestem zbyt zielony bym cokolwiek z tego rozumiał :?
Będę bardzo wdzięczny za pomoc.
Dodam że dodanie input.nextLine(); za dużo nie pomaga, w zasadzie dalej wyskakuje problem :/

Jeszcze lepiej, chciałem sprawdzić, czy sama ta pętla jeśli wyrzucić jakąkolwiek zmianę bollean'a "error" (warunku pętli while) się zapętli w nieskończoność, no i niestety nie, bo po pierwszym wykonaniu pętli, wyskakuje mi:

Exception in thread "main" java.util.NoSuchElementException
Co chcesz zrobić; 
Dodawać? Wpisz 1
Odejmować? Wpisz 2
	at java.base/java.util.Scanner.throwFor(Scanner.java:937)
Mnożyć? Wpisz 3
Dzielić? Wpisz 4
	at java.base/java.util.Scanner.next(Scanner.java:1594)
Potęgować? Wpisz 5
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
 Wyjść z programu? Wciśnij cyfrę od 6 do 9 lub 0
	at Program.main(Program.java:20)

A kod który dodałem to:
 

(...)
case 5:
                            Exponentiation exponentiation = new Exponentiation();
                            exponentiation.exp();
                            break;
                    }
                    input.nextLine();
                    iteration++;
                    if(iteration == 3){
                        error = false; // zatrzymanie pętli poprzez zmianę warunku while
                    }
                }catch(InputMismatchException ex){
                    System.out.println("Podałeś zły znak, spróbuj jeszcze raz!");
                }
(...)

Mało tego, w momencie gdy wykasuje zmienną "choice" i zamiast tego zrobię po prostu "switch(input.nextInt){" no to nadal wyskakuje exception pt. NoSuchElementException, tym razem wskazuje że wyjątek wyskakuje w miejscu odpowiedzialnym za drugiego switcha (wybór, czy wyjść z programu czy wykonać następne działanie
I ten sam problem wyskakuje, gdy stworzę drugi Scanner odpowiedzialny za drugiego switch'a, też nie chce współpracować i identyczny błąd wyskakuje

komentarz 4 grudnia 2018 przez Mateusz51 Nałogowiec (28,180 p.)
Polecam zamienic scanerNextInt na Integer.parseInt(scanner.nextLine()). Bezpieczniejsze i powinno dzialac
komentarz 8 grudnia 2018 przez MarioB Nowicjusz (120 p.)
Dzięki, ale mniej więcej w momencie gdy pisałeś, udało mi się pokonać ten problem kasując "input.close()" z metod odpowiedzialnych za wykonanie działań.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 1,307 wizyt
pytanie zadane 17 lutego 2017 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
1 odpowiedź 758 wizyt
pytanie zadane 21 lutego 2019 w Java przez Metarinda Użytkownik (740 p.)
0 głosów
1 odpowiedź 324 wizyt
pytanie zadane 30 sierpnia 2018 w Java przez michaljbjj Początkujący (460 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...