例外のスロー
例外のスローには 3 つの形式があり、1 つはスロー、もう 1 つはスローで、システムが自動的に例外をスローします。以下にそれらの類似点と相違点を示します。
システムは自動的に例外をスローします
プログラムステートメントに論理エラー、教義上のエラー、または型変換エラーがある場合、システムは自動的に例外をスローします。例: e
public static void main(String[] args) { int a = 5, b =0; System.out.println(5/b); //function(); }システムは自動的に ArithmeticException 異常をスローします:
Exception in thread "main" java.lang.ArithmeticException: / by zero at test.ExceptionTest.main(ExceptionTest.java:62)は自動的に NumberformatException 例外をスローします:
Rreeeeeeeeeeehrow
thRow は例外をスローするステートメントです。構文: throw (例外オブジェクト);
例:public static void main(String[] args) { String s = "abc"; System.out.println(Double.parseDouble(s)); //function(); }これは通常、プログラム内で特定のロジックが発生したときにプログラマが特定の種類の例外を積極的にスローする場合に使用されます。例:
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Double.parseDouble(Double.java:510) at test.ExceptionTest.main(ExceptionTest.java:62)
は例外をスローします:
throw e;
構文: [(修飾子)](戻り値の型)(メソッド名)([パラメータリスト])[throws(例外クラス)]{.. ....}
: r
public static void main(String[] args) { String s = "abc"; if(s.equals("abc")) { throw new NumberFormatException(); } else { System.out.println(s); } //function(); }Throws文から吐き出される可能性のある異常のうち、あるメソッドが吐き出される可能性がある場合、それを上位層に渡してそのメソッドのプログラム処理を呼び出します。例:
Exception in thread "main" java.lang.NumberFormatException at test.ExceptionTest.main(ExceptionTest.java:67)
処理結果は次のようになります:
データ型以外は変換できません。
throw と throws の比較
2. Throws は例外の可能性を表しますが、これらの例外は必ずしも発生するわけではありません。throw は例外がスローされることを意味し、throw を実行すると何らかの例外オブジェクトがスローされる必要があります。
3. どちらも例外を処理する受動的方法です (ここでの否定は、例外をスローするか、スローする可能性があるという意味ではありません)。ただし、実際の例外処理は関数によって行われません。上位層の呼び出し処理。 良いプログラミング習慣:1. プログラムを作成するときは、通常、try{...}catch{...} を使用して、例外が発生する可能性のある部分をキャッチして処理します。
2. try{... の後に使用します。 }catch{...} は例外をキャッチします。例外は、最も単純な出力ステートメント、またはスタック入力 e.printStackTrace() であっても、catch{...} で処理する必要があります。 ;3. IO 入力で例外をキャッチしている場合。および出力ストリーム。関数内で何らかの例外がスローされた場合は、try{...}catch{...} の後に必ずfinal{...}を追加してください。 throws 例外ステートメントを関数名に追加し、それを処理のために呼び出す上位レベルの関数に渡すことをお勧めします。
例:
throws E1、E2、E3 は、このメソッドがこれらの例外をスローする可能性があり、メソッドの呼び出し元がこれらの例外を処理する必要がある可能性があり、これらの例外 E1、E2、E3 が関数本体。
例:
public void function() throws Exception{......}
Exception1 例外が発生した場合、メソッドの呼び出し元によってキャッチされ処理された後にスローされます。
Exception2 例外が発生した場合、メソッドはそれを単独で処理します (つまり、System.out.println("An error happens!");)。したがって、このメソッドは Exception2 例外をスローしなくなり、 void doA() は Exception1 をスローします。Exception3 の Exception2 を記述する必要はありません。
throw ステートメントは、メソッド本体のステートメントによって処理される例外がスローされることを示すためにメソッド本体で使用されます。
throw は例外をスローする特定のアクションなので、例外インスタンスをスローします。
投げは、あなたがその可能性と傾向を持っていることを示しています。
投げたら、あなたはその傾向を現実に変えました。
システム例外の場合は、何もする必要はありません。または、メソッドの例外をスローすることもできます。システム例外はシステムによって自動的にキャッチされるため、この例外をメソッド内で解決する必要があるか、または解決するために上位関数に渡されます。実際、効果は同じです。しかし、多くの情報を確認したところ、例外がスローされてシステムがキャッチできる場合でも、メソッドに throw を記述することをお勧めします。そうすることで、他のプログラマが大規模なメソッドの完了時にどのような例外が発生するかを知ることができるからです。タスク。
それが自己定義の例外の場合、メソッドによってスローされる可能性のある例外をスローするために throws を使用する必要があります。そうしないと、コンパイルでエラーが報告されます。