2016-07-06 14 views
0

この質問があまりにも愚かか基本的なようであれば、私は事前に謝罪します。しかし、Googleの検索ではこれでどこにでもいらっしゃいませんでした。投げられるべき/投げられるべき例外

コードは単純です:

public class Average3 { 
    public static void main(String[] args) { 
    try { 

     printAverage(100, 0); 

    } catch (ArithmeticException ae) { 

     ae.printStackTrace(); 

     System.out.println("Exception handled in " + 
     "main()."); 

    } 
    System.out.println("Exit main()."); 

    } 

    public static void printAverage(int totalSum, int totalNumber) { 
    try { 

     int average = computeAverage(totalSum, totalNumber);// (8) 
     System.out.println("Average = " + 

      totalSum + "/" + totalNumber + " = " + average); 
    } catch (IllegalArgumentException iae) { 

     iae.printStackTrace(); 

     System.out.println("Exception handled in " + 
     "printAverage().");   
    } 
    System.out.println("Exit printAverage()."); 

    } 
    public static int computeAverage(int sum, int number) { 
    System.out.println("Computing average."); 

    return sum/number; 

    } 
} 

は出力:ここ

Computing average. 
java.lang.ArithmeticException:/by zero 
     at Average3.computeAverage(Average3.java:30) 
     at Average3.printAverage(Average3.java:17) 
at Average3.main(Average3.java:6) 
Exception handled in main(). 
Exit main(). 

0による除算がprintAverageによって呼び出されcomputeAverageに起こるので、私は、IllegalArgumentExceptionを期待していました。私の考えでは、tryステートメントはスキップする必要があり、この時点でキャッチに移動してIllegalArgumentExceptionを登録する必要があります。

私は実際に曇りのある理解を持っていますが、何が起こっているのか、そしてなぜそれが正しいのかを知りたいのです。私はこれに私の頭脳をラッキングしてきた。

ありがとうございます。

+0

なぜそれが 'IllegalArgumentException'の' catch 'に移動すべきですか? –

+0

try-catchブロックがあり、tryで文が失敗していると思っていたので、キャッチするように移動する必要があります – user6556673

+0

なぜ 'catch 'を使用すると例外の型があると思いますか?そのタイプは何を表していますか? –

答えて

0

例外は、あなたが処理していないArithmeticExceptionを、投げているprintAverageprintAverage

0

あなたcomputeAverage呼び出しでcomputeAverageでスローとキャッチする必要があります。

したがってIllegalArgumentExceptionのためのあなたのcatch文が実行されず、実行は、あなたのステートメントで停止:

System.out.println("Average = " + totalSum + "/" + totalNumber + " = " + average); 

... ArithmeticExceptionを投げます。

これはmainメソッドで検出され、ArithmeticExceptionprintStackTraceを呼び出します。

したがって、あなた代わりIllegalArgumentExceptionのごprintAverage方法でcatch ArithmeticExceptionしたいこと(そしておそらく根本的な原因としてArithmeticExceptionで包む再スローIllegalArgumentException、)。

しかし、おそらく最も良い方法は、最初に引数を確認し、何かが0に分割される場合はIllegalArgumentExceptionを投げることです。

+0

私は今それを得ました。ありがとう。 – user6556673

関連する問題