5

私にとって、これらのコード

static int faktorial (int n) throws ArithmeticException {
  if ((n < 0) || (n > 31)) { 
    throw new ArithmeticException();
  } 
  if (n > 1) {
    return n * faktorial(n - 1);
  } 
  else {
    return 1;
  }    
}

なしの同じコード

throws ArithmeticException

次のコードで使用する場合は、同じことを行います。

public static void main(String[] args) {
  try {
    int n;
    Scanner sc = new Scanner(System.in);  

    System.out.print("Insert integer number: ");        
    n = sc.nextInt();         
    System.out.println(n + "! = " + faktorial(n));
  }
  catch (InputMismatchException e) {
    System.out.println("Not an integer number!");
    e. printStackTrace();
  }
  catch (RuntimeException e) {
    System.out.println("Number is too big!");
    e. printStackTrace();
  }
}

を使用する場合、誰かが私を説明できますか

    throws ArithmeticException

私のコードにはいくつかの利点があります。

また、keyword を使用した良い例をいくつか紹介しthrowsます。どうもありがとうございました!

4

4 に答える 4

9

ArithmeticException未チェックの例外であるためthrows、コンパイラに関する限り、仕様に記載しても効果はありません。

throwsとはいえ、文書化の目的で仕様を保持することは良い考えだと思います。

ArithmeticExceptionはいえ、関数が無効な引数で呼び出されたときにスローされるのは、おそらく正しい例外ではありません。を使用IllegalArgumentExceptionする方が適切です。

于 2013-04-01T14:01:04.903 に答える
3

上記のメソッド シグネチャでは、式throws ArithmeticExceptionを使用して、この関数のユーザーに、メソッドがこの例外をスローする可能性があることを認識してキャッチする必要があることを伝えます (必要な場合は、この例外がチェックされていないという理由だけで "必要" であり、回避策を計画します)。場合)。

ただし、ArithmeticException は、この場合に使用する適切な例外ではありません (技術的には、それらのいずれかを使用できます)。IllegalArgumentException渡された引数が不適切であることを意味するため、例外をスローする方が適切です。

于 2013-04-01T14:03:49.913 に答える
3

言われていることとは別に、コーディングに役立つ利点が 1 つあります。

Eclipse はその情報 (メソッドが で宣言されていること) を使用し、(必要に応じて)適切なcatch 句throws RuntimeExceptionを追加できます。

これを見てみましょう:

public static void main(String[] args) {
    test();
}

private static void test() {
    foo();
    bar();
    baz();
}

public static void foo() {

}

public static void bar() throws NullPointerException {

}

public static void baz() throws IllegalArgumentException {

}

try/ catch blockメソッド内に追加するtestと、次のようになります。

private static void test() {
    try {
        foo();
        bar();
        baz();
    } catch (NullPointerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

いいですね。ただし、これは第 1 レベルのメソッド呼び出しでのみ機能するため、ランタイム例外の複数のキャッチでより高いレベルの抽象化を汚染することはありません。

public static void main(String[] args) {
    try {
        test();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static void test() {
    foo();
    bar();
    baz();
}

それもいいですね。

とにかく、javadoc でスローされることを確認することは、おそらくはるかに重要です:)

void Test.baz() throws IllegalArgumentException
于 2013-04-01T14:20:06.017 に答える