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