2015-11-20 77 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; 

您的程序將不再捕獲它並暫停執行。