2017-10-17 68 views
0

編寫一個計算N個整數平均值的程序。程序應該提示用戶輸入N的值,然後必須輸入所有Nnumbers。如果用戶爲N輸入了非正值,則應該拋出(並捕獲)出現「N必須是正數」消息的異常。如果在用戶輸入N個號碼時有任何異常,則應顯示錯誤消息,並且用戶提示再次輸入號碼。如果用戶沒有輸入整數,程序必須請求使用重新輸入值。Java程序計算平均值與例外

我是否正確地拋出異常?

import java.util.Scanner; 
import java.util.InputMismatchException; 

class Playground { 
    public static void main(String[ ] args) { 
     int sum = 0, mean; 
     System.out.println("Please enter number of integers"); 
     Scanner sc1 = new Scanner(System.in); 
     int counter = sc1.nextInt(); 

     if (counter <= 0) { 
      throw new InputMismatchException("N must be positive"); 
     } 
     else { 
      System.out.println("Please enter "+counter+" numbers"); 
     } 

     for (int i =0; i< counter; i++) { 
      int inputnum = sc1.nextInt(); 
      if (inputsum <= 0){ 
       throw new InputMismatchException("Please enter again"); 
       continue; 
      } 
      sum = sum+inputnum; 
      System.out.println(); 
     } 


     mean = sum/counter; 

     System.out.println(mean); 

    } 
} 
+2

不,你做得不對。從你的問題:「*應該被拋出(**和被捕獲**)*」 -​​ 你沒有捕捉到異常。 'throw'後的'continue'實際上是無法訪問的代碼。 – Maroun

+1

用'System.err.println(「請再次輸入」)替換'throw new InputMismatchException(「請再次輸入」);'和everthing將按預期工作。閱讀有關例外的教程。 – clemens

+1

雖然你想要求你的用戶再次輸入輸入,你的for循環仍然在滴答滴答。另外,即使這個數字不是正數,你仍然把它加到你的總和中,而你應該丟棄它。除了別人提到的異常處理之外,這些還有其他一些問題。 – Nishit

回答

2

拋出的異常被由最內層try/catch聲明該異常類相匹配抓到。 在這種情況下,try/catch聲明不在您的主要方法中。 換句話說,當拋出異常時,它會被捕獲以外的的主要功能,並且你的程序將完成。

當我們在被調用的函數中出現錯誤時,異常特別有用,我們需要將它報告給調用者繞過返回值,然後不需要爲錯誤保留一個值。

在這一行。

throw new InputMismatchException("Please enter again"); 
continue; 

continue永遠不會被控制,因爲throw(如return)達到使控制退出方法。

如果用一個簡單的System.out.println代替throw來描述問題,那麼程序將按照您的預期工作。

編輯:因爲您需要一個具體的例子,請考慮您的for聲明。您使用Scanner#nextInt()獲取下一個號碼。 如果Scanner完成其輸入源,它可能會拋出IllegalStateException?然後:

try { 
    for (int i =0; i< counter; i++) { 
       /* … */ 
    } 
} catch (IllegalStateException ex) { 
    System.err.println(ex.getMessage()); 
} 

如果任何IllegalStateException發生,這使得catch子句中的控制跳躍,使其走出for聲明沒有努力。

+0

感謝您的回覆。它現在總是有意義的,但在問題本身中有一些提供。拋出: InputMismatchException - 如果下一個標記與Integer正則表達式不匹配或超出範圍NoSuchElementException - 如果輸入已耗盡IllegalStateException - 如果此掃描器已關閉。所以我只是想知道,如果我可以通過儘可能恰當地使用這些問題來讓我的程序更好或更有效地解決問題? –

+1

如果你的程序沒有爲某個東西提供一個「接口」,但在代碼中使用'throw'本身是沒有意義的,但它只是一個簡單的程序,它接受它的輸入並給出它的輸出。順便說一句,如果你真的想使用它們,你可以使用try/catch語句。我會在這個問題上給你一個例子。 – NoImaginationGuy

0

這樣比較好還是有問題?

import java.util.Scanner; 
import java.util.InputMismatchException; 
import java.util.NoSuchElementException; 
import java.util.IllegalStateException; 

public class Calculator{ 
    public static void main(String[] args){ 
     int sum =0, mean; 
     System.out.println("Please enter no."); 
     Scanner sc1= new Scanner(System.in); 
     int counter = sc1.nextInt(); 
     if (counter <=0){ 
      throw new InputMismatchException("not valid no."); 
     } 
     else { 
      try { 
       for (int i = 0;i<counter;i++){ 
        int inputsum= sc1.nextInt(); 
        sum = inputsum+sum; 
        System.out.println(); 
       } 
       mean = sum/counter; 
       System.out.println(mean); 
      } 
      catch(IllegalStateException | NoSuchElementException | InputMismatchException e){ 
       System.err.println(e.getMessage); 
      } 
     } 
     catch(InputMismatchException e) { 
      System.out.println(e.getMessage); 
     } 
    } 
}