2

私はJavaを学んでいますが、最終的にコールスタックの先頭にあるほとんどのメソッドには、「例外をスローする」という宣言があるだけのようです。私が見逃しているこのステートメントの利点は何ですか?

もう1つの例。コードをいくつか書いた後、他の Java ライブラリのクラスを使用して、自分のクラスの 1 つを少しリファクタリングすることにしました。その結果、このクラスのメソッドの半分が宣言でさらに 5 つの例外を獲得しただけでなく、他のすべてのコードの約半分も同様でした。約。例外を間違って使用しているだけでしょうか?

重要な編集

私の質問は、そのステートメントが何をするかについてではありませんでした。ドキュメントから明らかです。なぜ言語設計者がこのステートメントを必要とすることにしたのか、私は実際に疑問に思っていました。

4

7 に答える 7

3

例外に対する Java のアプローチは、メソッドの呼び出し元に障害条件を認識させて、それらを強制的に処理するか、呼び出し元のメソッドで繰り返される throws ステートメントを介して例外が処理されないという事実を確認することです。別の言い方をすれば、どの例外がスローされるかを知ることは、メソッドの署名の一部であり、明示的な throws ステートメントです。

通常の操作過程では発生しないと予想される障害状態については、RuntimeException と Error という 2 つの特別な種類の例外があります。これらの例外のサブクラスは、throws 句で明示的に宣言したり、呼び出し元でキャッチしたりする必要はありません。

また、「throws Exception」を使用することは、メソッドの呼び出し元に実際の失敗のケースについて何も伝えないため、製品コードでのずさんなプログラミングであることに注意する価値があります。実際の例外の種類を列挙するのではなく、一般的な「throws Exception」宣言を使用することを検討する唯一のケースは、失敗ケースの明示的な宣言が役に立たない単体テストのようなケースです。

于 2011-07-01T23:03:55.467 に答える
3

他の答えは正しいですが、あなたが求めていた方法で目的を逃したと思います。

throws ステートメントは、例外スタック トレースを作成する方法です。Java にはあまり魔法はありません。例外を作成するのは、基本的なシステムのミステリーではなく、単に「Throw」ステートメントであるため、スタック トレースの最後のいくつかのエントリはおそらくスローされます。

多くの場合、例外処理は次のようなもので構成されているため、最後のものだけではありません。

try {
     do something that might cause an exception
catch(ExpectedException e) {
     throw new DifferetnException(e);
}

これにより、例外の種類を変更したり、より適切なテキストの説明を追加したり、一部の例外を処理しながら他の例外を再スローしたりすることができます。

このため、"Throw" ステートメントによって引き起こされるのは、多くの場合、最後のいくつかのレベル (およびおそらくその中間) です。

于 2011-07-01T23:04:12.057 に答える
1

これは、対処しなければならない例外的な状況が発生したことをクラスのユーザーに示します。throws 句の主語は、これらの例外的な状況が何であるかをユーザーに伝えます。

例外がチェック済み例外の場合、コンパイラはユーザーのコードに try/catch ブロックを適用します。未チェックの例外を処理するための catch ブロックは必要ありません。その場合、例外が処理されるか、プログラムが終了するまで、例外は呼び出しスタックをバブルアップし続けます。

于 2011-07-01T22:55:04.790 に答える
1

例外とベスト プラクティスについて多くのことを読んだ後、プログラミング エラーの処理に Exception クラスを使用して間違いを犯したことに気付きました。チェックされます。コードをリファクタリングした後、必要な場所でのみ「スロー」ステートメントを取得しました。

于 2011-07-03T12:44:04.397 に答える
0

発生する可能性のある問題を認識し、それらに対処するか、そうではないことを明示的に表明する必要があります。

于 2011-07-01T22:54:12.537 に答える
0

Java には、Checked ExceptionsRuntime Exceptionsがあります。

チェック例外は、それらを明示的に宣言するメソッドでのみ発生します。 実行時例外はコードのどこでも発生する可能性があり、宣言する必要はありません。このthrows IOException節は、このメソッドで IOException が発生する可能性があることを宣言しています。

ランタイム例外は、クラス RuntimeException を拡張するものです。その他はすべてChecked Exceptionsです。

例外はthrow new IOException(...)、メソッド内のようにステートメントによって実際にスローされます。

于 2011-07-01T23:09:05.630 に答える
-1

スローは例外を発生させます。例外は、それを処理できる catch ブロックによってキャッチされるまで、関数のスタックに逆方向に渡されます。

throw キーワードをメソッド宣言に入れると、そのメソッドの呼び出しで例外が生成される可能性があることを示します。例えば:

public void methodFoo (int val) throws IllegalArgumentException  {
    if (val <0) throw new IllegalArgumentExecption();
}

methodFoo がタイプ IllegalArgumentException の例外を発生させることができることを意味します。このようなメソッドを呼び出すときは、通常、次の try/catch ブロック ステートメントを使用します。

try{
   methodFoo(int param);

}catch (IllegalArgumentException e){
       //if any method call inside methodFoo will raise such exception the execution flow of the program will be interrupted and the execution restart from the first catch block that intercept that execption
}

このアプローチの「良い点」は、このような機能を使用すると、メソッド呼び出しが成功したことを確認するためにメソッドの戻り値をチェックする必要がないことです。C 言語では通常、次のようなことを行います。

int ret = methodFoo();

if (ret == null){
     //error
}
于 2011-07-01T22:57:03.700 に答える