2

Java のいくつかのメソッドは、NoSuchElementException、IllegalArgumentException などの例外をスローします。しかし、これらのメソッドを使用すると、これらの例外はチェックされていないように見えます。つまり、メソッドの呼び出し元は、これらの例外をスローするメソッドで try/catch を実行する必要はありません。デフォルトでは例外は「チェック」されており、エラーのみが「チェックされていない」ものであるようです。しかし、どういうわけか、私がスローした例外もチェックされていません。それは変だね。

メソッドが例外をスローしたときに、呼び出し元がコンパイル時に例外をキャッチする必要があることを確認するにはどうすればよいですか? 簡単に言うと、どうすればチェック例外をスローできますか?

ありがとう!

4

6 に答える 6

6

RuntimeExceptionとそのサブクラスのみがオフになっています。(まあ、Errorそしてそのサブクラスも同様ですが、Errorsをいじってはいけません。)チェックされた例外をスローするために必要なのは、それが拡張されないことを確認することだけRuntimeExceptionです。

于 2011-06-10T04:42:43.120 に答える
3

例外がチェックされているかどうかは、どのようにスローまたは宣言するかではなく、選択した例外が RuntimeException から派生したものであるかどうかにのみ依存します。上記のものはすべて RuntimeException から派生しているため、メソッドのクライアントはそれらをキャッチする必要はありません。

于 2011-06-10T04:41:35.177 に答える
3

Error と RuntimeException のサブクラスを除く、Throwable のすべてのサブクラスがチェックされます。(Throwable を直接サブクラス化できます)

コンパイラはこれらの例外をチェックしますが、実行時に特別な場所はありません。つまり、コンパイラが知らないうちにチェック済みの例外をスローすることができ、正常に動作します。

例えば

public static void throwChecked(Throwable t) /* no throws clause */ {
    Thread.currentThread().stop(t);
}

public static void main(String... args) /* no throws clause */ {
    throwChecked(new Throwable());
}

これにより、Throwable が期待どおりにコンパイルおよび出力されます。

于 2011-06-10T07:05:45.127 に答える
1

一歩下がって、チェックされた例外とチェックされていない例外をスローする理由の背後にある理論を学ぶ必要があると思います。例外に関するJava チュートリアルは、優れたリソースです。

Unchecked Exceptions — The Controversyというタイトルのページから:

ランタイム例外は、プログラミングの問題の結果である問題を表しており、そのため、API クライアント コードがそれらから回復したり、何らかの方法でそれらを処理したりすることは合理的に期待できません。

于 2011-06-10T04:53:41.740 に答える
0

拡張する例外はRuntimeException宣言する必要はありません。

メソッドを宣言することもできます: throws Exceptionor さらにthrows Throwable、それを処理する必要があります (推奨されませんが)。

于 2011-06-10T04:39:08.330 に答える