web-dev-qa-db-ja.com

すべての例外に必要なtry-catchがありますか?

簡単な質問ですが、その答えが見つかりません。 Javaのすべての例外でtry-catchを使用する必要がありますか?それともFileNotFoundExceptionのみですか?

多くの例外(IndexOutOfBoundException、ArithmeticException、IlligalArgumentException、NullPointerException)は、例外は必要なかったと言っていますが、FileNotFoundExceptionはそうです)...そして、try-catchを必要としない答えを見つけることができません。

15
Youri

例外のために_try/catch_ブロックが必要なわけではありません。代わりに、例外を適切に処理できる人にthrowすることができます。

例外には、チェックありとチェックなしの2種類があります。チェックされた例外考慮可能コンパイラーによって検出された例外であり、コンパイラーはそれが発生する可能性があることを認識しているため、catchまたはthrowを実行する必要がありますそれ。たとえば、ファイルを開きます。失敗する可能性があり、コンパイラはこれを知っているので、catchまたはthrow可能なIOExceptionを強制されます。

未チェックの例外考慮可能発生する可能性のある例外ですが、コードに基づいて、コンパイラは認識しません。つまり、これはプログラミングエラーです。たとえば、ユーザー入力を受け取り、数値を期待していて、ユーザーが文字列など予期しないものを入力した場合、プログラムはNumberFormatExceptionをスローします。これらのシナリオを予測して_try/catch_を配置し、発生する前に回避することができます。非常にまれに、_throws NullPointerException_または_throws NumberFormatException_を追加する人(または、その他のUnchecked例外をスローする人)は見られません。許可されていますが、その例外を明示的に作成することは奇妙であり、ほとんどの人はそれが悪いコーディングスタイルだと言うでしょう。

すべてのチェック済み提案mustは、それを処理できる何かに捕らえられるか、スローされることに注意してください。そうしないと、プログラムはコンパイルされません。それを処理できない何かにそれを投げると、あなたのプログラムはそれが発生した場合おそらくクラッシュするでしょう。

また、チェックされていない例外(例:実行時に発生し、通常は不適切なユーザー入力など)によってプログラムがクラッシュすることにも注意してください。したがって、何かが潜在的に問題を起こす可能性がある場合は、通常_try/catch_を使用することをお勧めしますが、必要はありませんです。

また、注目に値するのは、Checked例外はExceptionのサブクラスであり、Unchecked例外はRuntimeExceptionのサブクラスですが、RuntimeException自体はExceptionのサブクラスです。つまり、本当に必要な場合は、try {} catch (Exception e) {}を1つ使用すると、プログラムがスローする可能性のあるすべての例外をキャッチできます。確かに、これは例外に対処する恐ろしい方法と考えられており、個別に処理できるように、それぞれを個別にキャッチする必要があります。使わないようにしてください。

43
Aify

いいえ、すべての例外にtry-catchが必要なわけではありません。すべてのチェック済み例外には、試行キャッチが必要です。たとえば、NullPointerExceptionはチェックされていない例外であるため、try-catchは必要ありませんが、FileNotFoundExceptionはチェックされているため、1つ必要です。また、メソッドシグネチャに「スロー」を追加して、try-catchの必要を回避することもできます。

2
Josh Edwards

読む: https://docs.Oracle.com/javase/tutorial/essential/exceptions/

基本的にチェックされた例外は処理またはスローする必要があります未チェックの例外とエラーは処理またはスローされることがあります(エラーの処理は一般に悪い習慣と見なされます)。

チェック例外は、Java.lang.Exceptionを継承するすべてのものです。

未チェックの例外は、Java.lang.RuntimeExceptionから継承するすべてのものです

エラーは、Java.lang.Errorを継承するすべてのものです

1
cbeutenmueller

チェックされた例外のみが明示的にキャッチする必要があります。他のすべての種類の例外については、メソッドシグネチャに「スロー」を使用できます。

0
user2248671

はい、ただし、メソッドで処理したくない場合は、throwsキーワードを使用して、メソッドの呼び出し元に例外を渡すことができます。例:

void execption() throws Exception {
    throw new Exception();
}

void caller() {
    try {
        execption();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

編集:私はJavaで少し錆びています、ジョシュはNullPointerExceptionのようなtry/catchを必要としないチェックされていない例外があると言いましたが、チェックされていない例外があると思われる場合は追加できます投げた。例:

Object obj = null;

obj.hashCode();// if you think a NPE will be thrown you can use a try/catch here
0
J Atkin

明示的に呼び出すメソッドが例外をスローする場合、try....catchループを使用する必要があります。ただし、指定したリストの場合は、すべてランタイム例外です。プログラムに予期しない入力が含まれている場合や、プログラムが意図しない用途に使用された場合にスローされます。これらはtry....catchループを必要としません。

0
Blip