try/catch 语句期间发生错误

Error occurs during try/catch statement

好的,这是我的问题。我们的老师希望我们创建一个创建斐波那契数列的程序,然后用户可以对数字数组进行操作(如获取索引处的数字等)。我想超越并证明它是白痴。我问她关于 try/catch 语句,但她说它不在 curriculum.So 中,我做了研究并制作了这个代码:

while( valid ) {
        try {
            lengthOfSequence = keyboard.nextInt();
        } catch ( Exception e ) {
            out.println( "You entered an " + e + ". Please enter a number between 1 and " + maxLength );
            throw e;
        }
    }

(最初有效)所以代码应该得到用户输入的整数。然后获取该整数并将其分配给 lengthOfSequence。 运行 它正确地(输入一个整数)将允许代码正确地 运行,但是当我为我的输入插入一个 "o"(或任何其他字符串)时,捕获没有捕获异常,我得到这个错误:

java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at FibonacciRunner.main(FibonacciRunner.java:28)

我尝试了很多方法来修复它,包括:lengthOfSequence = Integer.parseInt( keyboard.nextLine() ); 这给了我

java.lang.NumberFormatException: For input string: "o"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at FibonacciRunner.main(FibonacciRunner.java:29)

我也尝试将异常命名为 InputMismatchExceptionNumberFormatException,但我仍然收到错误。

我是编码和 Stack Overflow 方面的新手,所以在此先感谢您的帮助

编辑: 我试过删除 throw e 但所做的只是创建一个无限循环的代码输出 "You entered an java.util.InputMismatchException. Please enter a number between 1 and 101".

我还从 try 语句中删除了它,因为我认为它与问题无关

 if( lengthOfSequence > 1 && lengthOfSequence < maxLength ) {
      fibonacci.createSequence( lengthOfSequence );
      valid = false;
 }

删除 throw e;,这就是您需要做的全部。您已经在 catch 子句中捕获了异常,如果您抛出它,那么您的调用方法将不得不再次捕获它。但是由于调用方法没有 try-catch 机制,程序将终止并给你未处理的异常

将您的代码更改为:

boolean valid = false;
while( !valid ) {
    try {
        lengthOfSequence = keyboard.nextInt();
        valid = true;
    } catch ( Exception e ) {
        out.println( "You entered a wrong value. Please enter a number between 1 and " + maxLength);
    }
}

如果您抛出异常,就像您在以下情况中所做的那样:

throw e;

您的程序将不再捕获它并将暂停执行。

Titus 以评论的形式回答了我的问题,但因为我无法将评论标记为问题,所以我自己回答:

这个问题类似于:How to handle infinite loop caused by invalid input using Scanner

引用提图斯的话:

to stop the loop when you receive bad input, you will have to consume that input in the catch block, you can do that by adding this statement in the catch block: keyboard.next() or keyboard.nextLine()

所以我只是在我的 catch 块中添加了一个 keyboard.next(); 并删除了 throw e 并且它停止了窃听。谢谢大家!