好的,这是我的问题。我们的老师希望我们创建一个创建Fibonacci序列的程序,然后用户可以使用数字数组进行操作(比如在索引处获取数字等)。我想要超越并且愚蠢地证明它。我向她询问了关于try / catch语句但是她说它不在课程中。所以,我做了研究并制作了这段代码:
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”(或任何其他字符串)时,catch没有捕获Exception并且我收到此错误:
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)
我还尝试命名例外InputMismatchException
和NumberFormatException
,但仍然收到错误。
我是编码和Stack Overflow的新手,所以提前感谢您的帮助
编辑:
我试图删除throw e
,但所有这一切都是创建一个无限循环的代码输出“你输入了java.util.InputMismatchException。请输入1到101之间的数字。”
我也从try语句中删除了这个,因为我认为它不属于问题
if( lengthOfSequence > 1 && lengthOfSequence < maxLength ) {
fibonacci.createSequence( lengthOfSequence );
valid = false;
}
答案 0 :(得分:1)
将您的代码更改为:
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;
您的程序将不再捕获它并暂停执行。
答案 1 :(得分:0)
删除throw e;
,这就是你需要做的。你已经在catch
子句中捕获了异常,如果你抛出它,那么你的调用方法必须再次捕获它。但由于调用方法没有try-catch
机制,程序将终止并为您提供UNCAUGHT EXCEPTION
答案 2 :(得分:0)
Titus作为评论回答了我的问题,但因为我不能将评论标记为问题,我只是自己回答:
此问题类似于:How to handle infinite loop caused by invalid input using Scanner
引用提图斯:
要在收到错误输入时停止循环,您必须在catch块中使用该输入,您可以通过在catch块中添加此语句来实现:
keyboard.next()
或keyboard.nextLine()
< / p>
所以我刚刚在我的catch块中添加了keyboard.next();
并移除了throw e
并且它停止了窃听。谢谢你们!