0

捕獲異常後,如何繼續執行Java程序?捕獲異常後繼續執行程序執行

我做了一個程序,要求用戶輸入一個數字,它會返回該數字除以生成的隨機數。但是,如果用戶輸入字母'a',則會發生異常。

如何讓程序繼續執行而不是在捕獲異常後終止?

do{      //Begin of loop 
    try{      //Try this code 
     System.out.println("Enter a number"); 
     double i = read.nextDouble(); //Reads user input 
     double rn = r.nextInt(10); //Generates random number rn 
     System.out.println(i + " divided by random number " + rn + " is " + (i/rn)); 
    }catch(InputMismatchException type_error){   //Catches error if there is a type mismatch 
     //Example error: if user enters a letter instead of a double 
     System.out.println("Error. You cannot divide a letter by a number!"); 
     break; //break stops the execution of the program 
    } 

    //using a continue statement here does not work 
}while(true);  //Loop forever 
+2

用'continue'交換'break'? – Mena

+0

使用continue進行交換中斷會在一次輸入後終止循環。 –

+2

Juste消除「休息」應該夠了。 – Berger

回答

1

continue聲明將重新啓動循環(而不是在break聲明,終止循環)。

因此如果更換break;continue;,你會不斷循環後您Exception被捕獲(不提供其他Exception被拋出但是一抓到),ANS顯示錯誤消息。

本質上,它會重新打印"Enter a number"

警告

您還需要消耗Scanner的下一個值。 如果不這樣做,使用continue將會在發生錯誤時永久循環,無需用戶交互。

Scanner read = new Scanner(System.in); 
do { 
    try { 
     // trimmed out non-necessary stuff 
     System.out.println("Enter a number"); 
     double i = Double.parseDouble(read.nextLine()); 
     System.out.println(i); 
     // changed exception caught 
    } 
    catch (NumberFormatException type_error) { 
     System.out.println("Error. You cannot divide a letter by a number!"); 
     continue; 
    } 

} while (true); 

最後說明

正如Berger提到,continue這裏甚至沒有必要的,因爲你只打印一條警告消息。

+0

謝謝,您能否通過使用掃描儀的下一個值來詳細說明您的意思?當我刪除break語句後,它會捕獲一個會永久打印的異常:輸入一個數字,並顯示錯誤消息,但沒有機會輸入。 –

+0

@MichealBingham不用客氣。查看我的編輯:nextDouble調用不會消耗掃描器的下一個值,只能檢索它,而nextLine成語則需要用戶再次輸入並返回。因此,在使用'nextDouble'出錯時,您會遇到無限循環,因爲它會一直處於失敗狀態。解決這個問題意味着一個稍微不同的成語(和'Exception'處理程序)。 – Mena

0

break聲明導致循環結束。

break聲明有兩種形式:帶標籤和無標籤。在前面關於switch語句的討論中,您看到了 未標記的表單。您 也可以使用未標記的突破,以終止一對,同時,還是做,而 循環

解決方案:

改變它continue

continue語句跳過的當前迭代,同時, 或do-while循環。

0

break語句導致循環退出。由於在try - catch構造之後的循環中沒有代碼,因此可以簡單地刪除break語句。

注意,Scanner方法(I假設readScanner)如果下一個標記代表一個雙nextDouble()返回雙精度值。如果沒有,它會拋出一個異常而不消耗該令牌。所以,你需要確保你消耗的下一個值,你可以用read.next()做到:

do{      //Begin loop 

    try{      //Try this code 
     System.out.println("Enter a number"); 
     double i = read.nextDouble(); //Reads user input 
     double rn = r.nextInt(10); //Generates random number rn 
     System.out.println(i + " divided by random number " + rn + " is " + (i/rn)); 


    }catch(InputMismatchException type_error){   //Catches error if there is a type mismatch 
    //Example error: if user enters a letter instead of a double 
     System.out.println("Error. You cannot divide " + read.next() + " by a number!"); 

    } 



} while(true); 
+0

當我這樣做時,程序將永久循環並詢問:輸入一個數字,然後顯示錯誤消息,但沒有機會輸入數字。 –

+0

查看更新的答案。 –

0

還有一個解決方案只是替代read.nextLine();break

break聲明導致循環結束。

continue將一次又一次地打印Enter a number

但是read.nextLine();,代碼會一次詢問輸入。

如果您刪除read.nextLine();continue,代碼將會打印輸入一個號碼。

+0

謝謝!這工作!但我不確定這是爲什麼工作 –

+0

@MichealBingham,輸入令牌不會被消耗,所以你需要再次明確地使用它。 'nextLine()'會做到這一點。 – Satya

-1

只要刪除休息;從那裏,一切都會正常工作。

不過要記住要終止條件,我不會在任何地方看到它。

+1

爲什麼標記爲負值?請置評論。 –

+0

@Mena這就夠了。您不需要繼續使用,因爲它是連續的循環。它會再次去請求輸入。只有終止條件是必需的,因爲它是無限循環的。 –

2

繼續不會幫助!如果您使用Scanner類輸入數字,則會出現無限循環寫入「錯誤,您不能用數字分隔一個字母!」輸出。

你的代碼等待一個雙數,但得到了一封信。此事件觸發異常,代碼顯示錯誤消息。但這封信將保留在掃描儀中,因此nextInt命令會嘗試在下一次迭代中加載相同的字母,而無需等待輸入。

在catch塊中,必須用read.next()命令清空掃描器。

Scanner read = new Scanner(System.in); 
    Random r = new Random(); 

    do {      //Begin of loop 

     try {      //Try this code 
      System.out.println("Enter a number"); 
      double i = read.nextDouble(); //Reads user input 
      double rn = r.nextInt(10); //Generates random number rn 
      System.out.println(i + " divided by random number " + rn + " is " + (i/rn)); 

     } catch (InputMismatchException type_error) {   //Catches error if there is a type mismatch 
      //Example error: if user enters a letter instead of a double 
      System.out.println("Error. You cannot divide a letter by a number!"); 

      // Empty the scanner before the next iteration: 
      read.next(); 
     } 

    //using a continue statement here does not work 
    } while (true);  //Loop forever 
相關問題