用InputMismatchException尝试/ catch创build无限循环

所以我正在构build一个从用户input中获取内容的程序。 我有什么似乎是一个非常简单的try / catch块,如果用户不input一个int,应该重复该块,直到他们这样做。 以下是代码的相关部分:

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); } } 

如果我为第二个整数input一个0,那么try / catch完全按照它应该做的,并且让我再次把它放入。 但是,如果我有一个InputMismatchException就像input5.5中的一个数字,它只是显示我的错误消息在一个无限循环。 为什么会发生这种情况,我该怎么办? (顺便说一下,我已经明确地尝试inputInputMismatchException作为要捕捉的参数,但它没有解决问题。

你需要调用next(); 当你得到错误。 另外build议使用hasNextInt()

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

读取整数值之前,您需要确保扫描仪有一个。 而且你不需要这样的exception处理。

  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

当一个扫描器抛出一个InputMismatchExceptionexception时,扫描器将不会传递引起该exception的标记,以便通过其他方法检索或跳过该标记。

你还可以尝试以下

  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); 

另一个选项是定义扫描仪input=新的扫描仪(System.in); 在try块内部,每次需要重新input值时,都会创build一个新的对象。

按照debobroto das的答案,你也可以放在后面

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

我有同样的问题,当我尝试这一点。 它完全解决了它。

由于bError = false语句永远不会try block 到达 ,并且语句被触发到所采取的input ,所以它会将错误打印在无限循环中

尝试通过使用hasNextInt()来使用它

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

或者尝试使用nextLine()加上Integer.parseInt()来进行input….

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

为了补充AmitD的答案:

只需复制/粘贴你的程序,并有这样的输出:

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

正如你所看到的,指令:

 n1 = input.nextInt(); 

当您input双数时,连续抛出exception,这是因为您的数据stream没有被清除。 要修复它,请按照AmitD的答案。

@Limp,你的回答是正确的,只需在读取input时使用.nextLine()。 示例代码:

  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); 

请阅读下面链接中导致此问题原因的说明。 寻找我在这个线程中的细节发布的答案。 Java家庭作业用户input问题

好的,我会简单介绍一下。 当您使用nextInt()读取input时,您只是读取数字部分,但ENDLINE字符仍在stream中。 这是主要原因。 现在看看上面的代码,我所做的只是读取整个行并parsing它,它仍然会抛出exception,并以您期望的方式工作。 其余的代码工作正常。