在“while循环”中使用“try and catch”块时无限循环

当我在while循环中使用try和catch块时,我的程序有一个无限循环

import java.util.*; class Try { public static void main(String args[]) { Scanner sc=new Scanner(System.in); while(true) { try { System.out.println("Enter a no "); int s=sc.nextInt(); } catch(Exception e) { System.out.println("Invalid input try again"); } } } } 

当我输入一个整数时,它运行正常并要求另一个输入,但是当我输入一个char时,它会进行无限循环。 为什么会这样?

当遇到无效输入时,您的程序会进入无限循环,因为nextInt()不会使用无效的令牌。 因此,无论引起exception的任何令牌都将保留在那里,并在下次尝试使用nextInt()时继续引发exception。

这可以通过在catch块中放入nextLine()调用来解决,以消耗导致抛出exception的任何输入,清除输入流并允许用户继续尝试。

你没有打破循环。 要结束循环,您需要插入

 break; 

无论你想在哪里结束循环。

扫描int不会消耗换行符(按Enter键)。 因此,它每次都会读取换行符charackter并抛出一个InputMismatchException。

只需在输入调用next()nextLine()即可使用它。

注意: next()仅适用于unix,因为它只读取一个字节,而Windows结束了一个包含两个字符串的行(\ r \ n)。

问题是,当你调用nextInt你会nextInt Scanner ,所以一旦nextIntexception导致它就无法使用。 该Scanner不再有效。 为了解决这个问题,您应该将内容读作string并进行转换,当转换操作失败时,您不必担心任何事情。

我会这样做:

 import java.util.*; class Try { public static void main(String args[]) { Scanner sc=new Scanner(System.in); while(true) { try{ System.out.println("Enter a no "); int s=Integer.parseInt(sc.next()); // or sc.nextLine() if you wish to get multi digit numbers }catch(Exception e) { System.out.println("Invalid input try again"); } } } }