为什么我的异常处理中的错误会导致无限循环?

时间:2019-02-24 05:14:18

标签: java exception-handling

我在处理异常时遇到麻烦。如果我输入数字,程序运行正常,但是如果输入字符,则会创建无限循环。

boolean ask= true;
    while(ask)
    {
        ask = false;
        try 
        {
            System.out.println("What is the age?");
            int age = input.nextInt();  
            setAge(age);
        }catch(InputMismatchException e) {
            System.out.println("Invalid input!");
            ask = true;
        }
    }//end while

3 个答案:

答案 0 :(得分:1)

假设您输入“ abc”

您对input.nextInt()的调用使扫描程序查看a并说:“那不是整数,所以我会抛出异常。”

在异常处理程序中,将ask设置为true,以便重复循环。

重复循环时,扫描程序会再次查看完全相同的a,并说“这不是整数,所以我会抛出异常。”

在异常处理程序中,将ask设置为true,以便重复循环。

以此类推。...

令人讨厌的a永远不会被扫描仪消耗掉。

答案 1 :(得分:1)

尝试以下代码:

      boolean ask= false;
        while(!ask)
        {
           try
           {
               System.out.println("What is the age?");
               int age = input.nextInt();//does not read the newline character in your input created by hitting "Enter,"
               setAge(age);
               ask = true;
           }catch(InputMismatchException e) {
               System.out.println("Invalid input!");
               input.nextLine();//consumes the \n character
           }
        }//end while

答案 2 :(得分:0)

来自nextInt的源代码:

    public int nextInt(int radix) {
        // Check cached result
        if ((typeCache != null) && (typeCache instanceof Integer)
            && this.radix == radix) {
            int val = ((Integer)typeCache).intValue();
            useTypeCache();
            return val;
        }
        setRadix(radix);
        clearCaches();
        // Search for next int
        try {
            String s = next(integerPattern());
            if (matcher.group(SIMPLE_GROUP_INDEX) == null)
                s = processIntegerToken(s);
            return Integer.parseInt(s, radix);
        } catch (NumberFormatException nfe) {
            position = matcher.start(); // don't skip bad token
            throw new InputMismatchException(nfe.getMessage());
        }
    }

它使用Integer.parseInt(s, radix);来产生结果。
如果呼叫Integer.parseInt("s");将导致:

线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“ s”