尝试捕获时无限发挥

时间:2016-05-20 06:55:11

标签: java try-catch do-while infinite

尝试在while循环中执行try-catch语句时遇到问题。我要求用户首先输入字母然后输入一个数字,如果他正确输入数字,程序结束。如果他输入字母而不是数字,程序应该说"发生错误请输入数字"并要求用户再次输入数字,但每次我输入字母而不是数字时,程序进入无限循环并且不允许我输入新值。 然后就去吧 "发生错误,您必须输入数字" "请输入数字"。

public class OmaBrisem {

    public static void main(String[] args) {
        Scanner tastatura = new Scanner(System.in);
        boolean b = true;
        int a = 0;
        String r = "";
        System.out.println("Please enter a letter");
        r = tastatura.next();
        do {
            try {
                System.out.println("Please enter numerical value");
                a = tastatura.nextInt();
                b = true;
            } catch (Exception e) {
                System.out.println("An error occured you must enter number");
                b = false;
            }
        } while (!b);

    }

}

4 个答案:

答案 0 :(得分:6)

这是你的问题。如果用户输入了您希望输入数字的非数字,则nextInt()会引发异常,但它不会从输入流中删除该字母!

这意味着当您循环返回以再次获取该号码时,该字母将,并且您的nextInt()将再次引发异常。等等,无限制地(或者至少直到宇宙的热量死亡,或者机器最终崩溃,以先到者为准)。

解决此问题的一种方法是在nextInt()失败时实际读取/跳过下一个字符,以便从输入流中删除它。您基本上可以使用Scanner.findInLine(".")执行此操作,直到Scanner.hasNextInt()返回true。

以下代码显示了一种方法:

import java.util.Scanner;
public class MyTestProg {
     public static void main(String [] args) {
         Scanner inputScanner = new Scanner(System.in);
         System.out.print("Enter letter, number: ");

         // Get character, handling newlines as needed

         String str = inputScanner.findInLine(".");
         while (str == null) {
             str = inputScanner.nextLine();
             str = inputScanner.findInLine(".");
         }

         // Skip characters (incl. newline) until int available.

         while (! inputScanner.hasNextInt()) {
             String junk = inputScanner.findInLine(".");
             if (junk == null) {
                 junk = inputScanner.nextLine();
             }
             System.out.println("Ignoring '" + junk + "'");
         }

         // Get integer and print both.

         int num = inputScanner.nextInt();
         System.out.println("Got '" + str + "' and " + num);
     }
}

以下成绩单显示了它的实际效果:

Enter letter, number: Abcde42
Ignoring 'b'
Ignoring 'c'
Ignoring 'd'
Ignoring 'e'
Got 'A' and 42

答案 1 :(得分:1)

我意识到我的程序在try块中忽略了Scanner对象tastatura,每当我插入错误的值并且while循环再次启动时,我创建了Scanner类的新对象并将其命名为tastatura2并且我的程序正常工作。

Scanner tastatura = new Scanner(System.in);
        boolean b = true;
        int a = 0;
        String r = "";
        System.out.println("Please enter a letter");
        r = tastatura.next();
        do {
            try {
                Scanner tastatura2 = new Scanner(System.in);
                System.out.println("Please enter numerical value");
                a = tastatura2.nextInt();
                b = true;
            } catch (Exception e) {
                System.out.println("An error occured you must enter number");
                b = false;
            }
        } while (!b);

答案 2 :(得分:0)

只需在tastatura.nextLine()块中添加catch即可丢弃最后一个输入。

答案 3 :(得分:0)

当捕获到异常时,您可以通过break;离开循环...所以只需添加:

            break;

在你的捕获座上:)

catch子句看起来像这样:

catch (Exception e) {
            System.out.println("An error occured you must enter number");
            b = false;
            break;
        }