prova / cattura con InputMismatchException crea loop infinito

Quindi sto costruendo un programma che prende in carico l’input dell’utente. Ho quello che sembra essere un blocco try / catch molto semplice che, se l’utente non immette un int, dovrebbe ripetere il blocco finché non lo fa. Ecco la parte rilevante del codice:

import java.util.InputMismatchException; import java.util.Scanner; public class Except { public static void main(String[] args) { Scanner input = new Scanner(System.in); boolean bError = true; int n1 = 0, n2 = 0, nQuotient = 0; do { try { System.out.println("Enter first num: "); n1 = input.nextInt(); System.out.println("Enter second num: "); n2 = input.nextInt(); nQuotient = n1/n2; bError = false; } catch (Exception e) { System.out.println("Error!"); } } while (bError); System.out.printf("%d/%d = %d",n1,n2, nQuotient); } } 

Se inserisco uno 0 per il secondo intero, allora try / catch fa esattamente quello che dovrebbe e me lo fa inserire di nuovo. Ma, se ho un InputMismatchException come inserendo 5.5 per uno dei numeri, mostra solo il mio messaggio di errore in un ciclo infinito. Perché sta succedendo questo, e cosa posso fare al riguardo? (A proposito, ho provato a digitare esplicitamente InputMismatchException come argomento da prendere, ma non ha risolto il problema.

Devi chiamare next(); quando ottieni l’errore Inoltre è consigliabile usare hasNextInt()

  catch (Exception e) { System.out.println("Error!"); input.next();// Move to next other wise exception } 

Prima di leggere il valore intero è necessario assicurarsi che lo scanner ne abbia uno. E non avrai bisogno di una gestione delle eccezioni del genere.

  Scanner scanner = new Scanner(System.in); int n1 = 0, n2 = 0; boolean bError = true; while (bError) { if (scanner.hasNextInt()) n1 = scanner.nextInt(); else { scanner.next(); continue; } if (scanner.hasNextInt()) n2 = scanner.nextInt(); else { scanner.next(); continue; } bError = false; } System.out.println(n1); System.out.println(n2); 

Javadoc di Scanner

Quando uno scanner genera un’eccezione InputMismatch, lo scanner non passa il token che ha causato l’eccezione, in modo che possa essere recuperato o saltato tramite un altro metodo.

Puoi anche provare quanto segue

  do { try { System.out.println("Enter first num: "); n1 = Integer.parseInt(input.next()); System.out.println("Enter second num: "); n2 = Integer.parseInt(input.next()); nQuotient = n1/n2; bError = false; } catch (Exception e) { System.out.println("Error!"); input.reset(); } } while (bError); 

un’altra opzione è definire Scanner input = new Scanner (System.in); all’interno del blocco try, questo creerà un nuovo object ogni volta che è necessario reinserire i valori.

Per seguire la risposta di debobroto das puoi anche mettere dopo

 input.reset(); input.next(); 

Ho avuto lo stesso problema e quando ho provato questo. Lo ha completamente risolto.

Poiché bError = false statement non viene mai raggiunto nel try block , e l’istruzione viene colpita sull’input preso , continua a stampare l’ errore nel ciclo infinito .

Prova ad usarlo in questo modo usando hasNextInt()

 catch (Exception e) { System.out.println("Error!"); input.hasNextInt(); } 

Oppure prova a usare nextLine() accoppiato con Integer.parseInt() per prendere input ….

 Scanner scan = new Scanner(System.in); int num1 = Integer.parseInt(scan.nextLine()); int num2 = Integer.parseInt(scan.nextLine()); 

Per completare la risposta AmitD:

Basta copiare / incollato il tuo programma e ha avuto questo risultato:

 Error! Enter first num: .... infinite times .... 

Come puoi vedere, l’istruzione:

 n1 = input.nextInt(); 

Lancia continuamente l’eccezione quando viene inserito il tuo doppio numero, e questo perché il tuo stream non è cancellato. Per risolverlo, segui la risposta di AmitD.

@ Limp, la tua risposta è giusta, basta usare .nextLine () durante la lettura dell’input. Codice d’esempio:

  do { try { System.out.println("Enter first num: "); n1 = Integer.parseInt(input.nextLine()); System.out.println("Enter second num: "); n2 = Integer.parseInt(input.nextLine()); nQuotient = n1 / n2; bError = false; } catch (Exception e) { System.out.println("Error!"); } } while (bError); System.out.printf("%d/%d = %d", n1, n2, nQuotient); 

Leggi la descrizione del motivo per cui questo problema è stato causato nel link sottostante. Cerca la risposta che ho postato per il dettaglio in questa discussione. Problema di input dell’utente di Java Homework

Ok, lo descriverò brevemente. Quando si legge l’input usando nextInt (), si legge semplicemente la parte numero, ma il carattere ENDLINE era ancora nello stream. Questa era la causa principale. Ora guarda il codice qui sopra, tutto ciò che ho fatto è leggere l’intera riga e analizzarla, getta ancora l’eccezione e funziona come ti aspettavi che funzionasse. Il resto del tuo codice funziona bene.