2015-11-20 88 views
-2

好的,这是我的问题。我们的老师希望我们创建一个程序,创建一个斐波那契数列,然后用户可以使用数组数组(例如在索引处获取数字)进行操作。我想要超越,并且可以防止白痴。我问她的try/catch语句,但她说,这是不是在curriculum.So,我做了研究,取得这样的代码:在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”(或任何其他字符串)时,捕获不会捕获异常,并且出现此错误:

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但这一切的确是创建代码输出的死循环“你输入了一个java.util.InputMismatchException,请输入1到101之间的数字”。

此外,我除去这从try语句,因为我认为这将不会涉及到这个问题

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

你觉得'扔e;'做什么?你为什么这么认为? –

+0

您正在捕捉异常。但是你正在抛出另一个异常。删除'扔e',让我们知道会发生什么 – jiaweizhang

+0

你正在捕捉异常,但扔回去。您得到NumberFormatException的原因是因为您尝试将非整数值解析为整数和InputMismatchException,因为nextInt()需要整数,但获取非整数值。在发现异常之后,你希望做什么? – Raf

回答

0

泰特斯回答我的问题作为一个评论,但因为我不能标记为问题评论生病只是回答我自己:

这个问题是相似的: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()

所以我刚加了一个keyboard.next();到我的catch块并删除了throw e,它停止了跳出。感谢你们!

0

删除throw e;,这就是你需要做的。你已经在catch条款中发现了异常,如果你抛出它,那么你的调用方法将不得不再次捕获它。但是,由于该调用方法不具有try-catch机制,计划将终止,并给你捕获的异常

+1

如果他们删除rethrow,下一次循环迭代会发生什么? –

+0

'throw e;'必须用break或其他机制来代替以停止循环。但这不是OP要求的。 –

+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; 

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