2

Javaでカスタム例外をスローできるようにしたいので、少し混乱しています。throws MyException関数内でこれを行うには、関数のヘッダーに追加する必要があります。

そして、その関数を順番に呼び出すものはすべてthrows MyException、try-catchブロックを追加または持つ必要があります。しかし、これはなぜですか?

たとえば、Javaでスタックを作成してpop関数を呼び出す場合、try-catchを使用する必要NoSuchElementExceptionはありませんが、要素がない場合、Javaのpopメソッドは(またはw / e)をスローします。スタック上。

4

4 に答える 4

4

NoSuchElementExceptionRuntimeException(チェックされていない例外)であり、RuntimeExceptionSを処理または宣言する必要がないため、コンパイラは文句を言わず、代わりに実行時にスローします。

チェックされた例外、つまり、のサブタイプではないすべての例外の場合RuntimeException、コンパイラは適切な句をチェックし、プログラムが;catch内で操作を実行した後、実行を継続できるようにします。catchこれを行うには、try/catchブロックを使用してそれらを処理するか、throws句を使用してそれらを宣言する必要があります-呼び出しチェーンの上位で例外を処理する責任を委任します。カスタム例外がチェックされた例外のルールでない場合は、カスタム例外RuntimeExceptionにも適用されます。

チェックされた例外--->コンパイラによって強制的に処理または伝播されます

チェックされていない例外--->コンパイラによってチェックされていないため、実行時に表示されます

于 2012-12-23T08:04:18.943 に答える
3

Javaは、いわゆるチェックされた例外とチェックされていない例外を持っています。チェックされた例外はメソッドシグニチャで宣言する必要があり、チェックされていない例外は宣言する必要はありません。

チェックされていない例外を自分で定義したい場合は、のRuntimeExceptioninstedから派生させますException

于 2012-12-23T08:05:07.043 に答える
0

チェックされたすべての例外をスローまたは試行してキャッチすることになっています。これは必須ではなく、RunTimeException話している例外はRuntimeExceptionです。

于 2012-12-23T08:04:39.130 に答える
0

この質問に対する私の答えを参照してください。

一般的な経験則として、カスタム例外クラスを作成するかどうかを決定するときは、組み込みの例外クラスを可能な限り使用するようにしていますIllegalArgumentException

これは、カスタムを作成する方法の例です。これは、ご存知のとおり、ブロックや句RuntimeExceptionを必要としません。try/catch/finallythrows

public class MyRuntimeException extends RuntimeException {
    public MyRuntimeException() {
        super();
    }

    public MyRuntimeException(String message) {
        super(message);
    }
}

public class MyClass {
    public void go(int val) {
        if(val <= 0) throw new MyRuntimeException("Val must be greater than 0.");
    }
}
于 2012-12-23T09:01:33.813 に答える