catch块正在为InputMismatchException多次运行

时间:2017-03-08 07:44:27

标签: java exception-handling java.util.scanner inputmismatchexception

所以我在我的程序中使用这个代码,每当我给出包含多个单词的输入时,编译器会多次执行catch块。我也用不同的方法尝试过它。到目前为止,所有的努力都是徒劳的。

方法1:

Scanner scanner = new Scanner(System.in);
int size = 0;
while (true) 
{
    try
    {
        size = scanner.nextInt();
        break;
    }
    catch (InputMismatchException e) 
    {
        System.out.println("Enter valid input (Digit Only)");
        scanner.next();
        continue;
    }
}

方法2:

Scanner scanner = new Scanner(System.in);
int size = 0;
boolean bError = true;
while (bError) 
{
    if (scanner.hasNextInt())
        size = scanner.nextInt();
    else 
    {
        System.out.println("Enter valid input (Digit Only)");
        scanner.next();
        continue;
    }
    bError = false;
}

方法3:

Scanner scanner = new Scanner(System.in);
int size = 0;
while (true) 
{
    if (scanner.hasNextInt())
    size = scanner.nextInt();
else 
{
    scanner.next();
    System.out.println("Enter valid input (Digit Only)");
continue;
}
String sizeStr = Integer.toString(size);
Pattern pattern = Pattern.compile(new String ("^[0-9]*$"));
Matcher matcher = pattern.matcher(sizeStr);
if(matcher.matches())
{    
    break;
}
else
{
    System.out.println("Enter valid input (Digit Only)");
    continue;
}
}

方法4:

Scanner scanner = new Scanner(System.in);
int size = 0;
while (scanner.hasNext()) 
{
    if (scanner.hasNextInt())
    {
        size = scanner.nextInt();
        System.out.println(size);
        break;
    }
    else
    {
        System.out.println("Enter valid input (Digit Only)");
        scanner.next();
    }
}

我现在能够通过获取String输入然后将其解析为int来完成任务。但最初的疑问仍然是为什么那不能正常工作。下面的代码工作正常。

Scanner scanner = new Scanner(System.in);
int size = 0;
while (true) 
{
    try
    {
        String sizeStr = scanner.nextLine();
        size = Integer.parseInt(sizeStr);
        break;
    }
    catch (NumberFormatException e) 
    {
        System.out.println("Enter valid input (Digit Only)");
        scanner.next();
        continue;
    }
}

1 个答案:

答案 0 :(得分:0)

根据官方Java Doc(Heirloom sh):

sh

默认情况下,除了nextLine()之外的扫描程序类的所有下一个*()函数都读取下一个标记,而不是下一行。这意味着它会一直读取,直到找到空格。如果要读取一行中的所有标记,则需要使用nextLine(),然后根据需要显式格式化输入。

考虑这个输入:

sh

当您执行scanner.nextInt()或除扫描仪.nextLine()以外的任何scanner.next *()函数时,只有" abcd"被读取,因为它是下一个标记。当你执行scanner.nextLine()时,当前行中的完整字符串" abcd xyz"读取,扫描仪前进到下一行。

但是,如果你想让nextInt()函数读取整行,那么你可以将分隔符设置为新行' \ n'。

A Scanner breaks its input into tokens using a delimiter pattern, 
which by default matches whitespace. The resulting tokens may then be 
converted into values of different types using the various next 
methods.

The scanner can also use delimiters other than whitespace.

使用此功能,您可以获得所需的行为。