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

Why does my error my exceptions handling cause an infinite loop?

我在处理异常时遇到问题。如果我输入一个数字,程序运行正常,但如果输入一个字符,程序会创建一个无限循环。

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

假设您输入 "abc"

您对 input.nextInt() 的调用导致扫描器查看 a 并说 "That's not an int, so I will throw an exception."

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

当循环重复时,扫描仪再次查看完全相同的 a,它会显示 "That's not an int, so I will throw an exception."

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

等等....

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

来自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"

试试下面的代码:

      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