6

たとえば、これらの両方が機能していることに気付きました。

public void func(int a) throws IllegalArgumentException {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}

public void func(int a) {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}

それは私に尋ねさせます:

throws anExceptionいつ発表し、いつ発表しないで、それについて宣言せずに投げるべきですか?

4

7 に答える 7

4

チェックされた例外は、常にメソッド シグネチャに記述する必要がありますthrows

例外 の場合は、メソッド名extend RuntimeExceptionを記述する必要はありませんがthrows、メソッドのドキュメントに記載されている方が明確であり、メソッドのドキュメントに記載されるため、強くお勧めします。

/**
 * @throws This won't appear if you don't write `throws` and this might
 * mislead the programmer.
 */
public void func(int a) throws IllegalArgumentException {
    if(a < 0) 
        throw new IllegalArgumentException("a should be greater than 0.");
}
于 2013-10-22T11:45:54.083 に答える
2

JLS セクション 11.2から:

Java プログラミング言語では、メソッドまたはコンストラクターの実行によって発生する可能性のあるチェック済み例外のハンドラーがプログラムに含まれている必要があります。可能な結果であるチェック済み例外ごとに、メソッド (§8.4.6) またはコンストラクター (§8.8.5) の throws 節で、その例外のクラスまたはその例外のクラスのスーパークラスの 1 つを言及する必要があります (§ 11.2.3)。

簡単に言うと、 if an exception is checkedthrowsステートメントが必要です。があり、それが のサブクラスでない場合は、チェックされます。 ExceptionRuntimeException

IllegalArgumentExceptionは のサブクラスであるRuntimeExceptionため、チェックされていないため、throws ステートメントで宣言する必要はありません。これは、このようなほとんどの例外 ( など) に当てはまります。これはIllegalArgumentExceptionNullPtrExceptionこれらを簡単に処理できると合理的に期待できないためです。

于 2013-10-22T11:45:48.933 に答える
0

チェックされた例外を宣言する必要がありますが、メソッドまたはコンストラクターの実行によってスローされる可能性がある場合、 未チェックの例外はメソッドまたはコンストラクターの throws 句で宣言する必要はありません.. from - http://docs.oracle.com /javase/7/docs/api/java/lang/RuntimeException.html

于 2013-10-22T12:12:51.887 に答える