2017-10-17 13 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("をもう一度入力してください);と入力してください。例外についてのチュートリアルを読んでください。 – clemens

+1

入力を再度入力するようにユーザーに依頼しても、forループは依然として有効です。また、数値が正ではないにもかかわらず、あなたはそれを捨てるべきであるのに対し、あなたの合計に加えています。これらは、他の人に言及されている例外処理とは別に、さらに2つの問題です。返信いただきありがとうございます。 – Nishit

答えて

2

スローされた例外は例外クラスに一致するtry/catch文を囲む最も内側でをキャッチされています。 この場合、try/catchステートメントはメインメソッドの外にあります。例外がスローされたとき、つまり は、それが外の主な機能を引っ掛かり、そしてあなたのプログラムが終了します。私たちが呼び出された関数の内部でエラーが発生しているとき

例外は特に有用であると私たちはその後、エラーの値を確保する必要はありません、戻り値を、バイパスし、発信者に報告する必要があります。

この行にあります。

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

continue

throwreturnのような)ので、制御が到達しない制御方法を残して作る飽きないだろう。

throwを単純な0​​に置き換えると、プログラムは期待どおりに機能します。

編集:具体的な例が必要なので、forステートメントを検討してください。次の番号を取得するにはScanner#nextInt()を使用します。 Scannerの入力ソースが終了した場合、IllegalStateExceptionがスローされることがありますか?その後:任意のIllegalStateExceptionが発生した場合

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

、これはそれが無い努力でfor文の出作り、catch句の制御ジャンプします。

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