【问题标题】:Endless loop while using "try and catch " block inside a "while loop"在“while 循环”中使用“try and catch”块时的无限循环
【发布时间】:2017-08-31 10:51:43
【问题描述】:

当我在 while 循环中使用 try and 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");
            }
        }
    }
}

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

【问题讨论】:

  • 它是继续打印还是只是挂起?
  • 它将在无限循环中打印什么
  • 它像无限循环一样,不断打印“输入一个否”“Invlide input try again”

标签: java while-loop try-catch infinite-loop


【解决方案1】:

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

break;

您希望循环结束的任何地方。

【讨论】:

  • 实际上我想在另一个程序中使用相同的逻辑,并且我不想打破循环,我希望它在打印错误后将光标发送回输入部分(捕获块) , 重新输入数据,但除此之外它进入无限循环......!!
【解决方案2】:

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

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

【讨论】:

  • 使用中断语句会退出程序,我不想退出,
  • 抱歉,我发现是您的扫描仪出了问题。没想清楚,试试看。我相信我有正确的答案。
  • next() 在 Windows 上可能不起作用,因为它只读取一个字节,而 Windows 使用两个字符来结束一行( \r\n )。
  • @DonFoumare 谢谢。
  • @flakes 哈哈!是的,内存不足或减慢输入速度。
【解决方案3】:

扫描int 不会消耗换行符(按回车键)。因此它每次都会读取换行符并抛出 InputMismatchException。

您可以通过简单地调用next()nextLine() 您输入后使用它。

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

【讨论】:

    【解决方案4】:

    问题是当你调用nextInt时,你会搞砸Scanner,所以一旦出现异常,nextInt就不能使用了。 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");
                   }
            }
        }
    }
    

    【讨论】:

      【解决方案5】:

      为了解决这个问题,您需要清除输入流,否则已经捕获的相同异常会导致无限循环。通过在 catch 块中添加 nextLine() 会消耗导致抛出异常的任何输入。作为这种情况的最佳实践,最好使用 hasNextInt() 在调用 nextInt() 之前检查用户输入

      import java.util.*;
      class Try {
          public static void main(String args[]) {
              Scanner scanner=new Scanner(System.in);
              while(true) {
                  try {
                      System.out.println("Enter a Number");
                      int num=scanner.nextInt();
                  } catch(Exception e) {
                      System.out.println("Invalid input try again");
                      scanner.nextLine(); // cause to consume already caught Exception 
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 2017-10-09
        相关资源
        最近更新 更多