• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
939 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,344 wizyt
pytanie zadane 17 lutego 2017 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
1 odpowiedź 811 wizyt
pytanie zadane 21 lutego 2019 w Java przez Metarinda Użytkownik (740 p.)
0 głosów
1 odpowiedź 360 wizyt
pytanie zadane 30 sierpnia 2018 w Java przez michaljbjj Początkujący (460 p.)

93,103 zapytań

142,079 odpowiedzi

321,583 komentarzy

62,445 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...