スローとスローの違いは何ですか。 Javaでスロー
公開: 2013-07-231つはそれを宣言し、もう1つはそれを行います
Javaでの例外処理に関連するキーワードは5つあります。たとえば、try、catch、finally、throw、throwsです。 ファイナル、ファイナル、ファイナライズの違いは別として、スローとスローは、Javaインタビューでよく聞かれる質問の1つです。
- throwキーワードは、Javaの任意のメソッドまたは静的ブロックからExceptionをスローするために使用され、 throwsキーワードは、メソッド宣言で使用され、このメソッドによってスローされる可能性のあるExceptionを示します。 それらは互換性がありません。
- 以下の例に示すように、いずれかのメソッドがチェック済みの例外をスローした場合、呼び出し元はこの例外をキャッチして処理するか、メソッド宣言で別のthrows句を宣言して再スローできます。
- Throw句は、呼び出し元のメソッドに特定の例外をスローする必要があると思われるコードの任意の部分で使用できます。
Java例外を過小評価する:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
java . lang . Object | +-- java . lang . Throwable | +-- java . lang . Exception | | | +-- java . lang . ClassNotFoundException | | | +-- java . io . IOException | | | | | +-- java . io . FileNotFoundException | | | +-- java . lang . RuntimeException | | | +-- java . lang . NullPointerException | | | +-- java . lang . IndexOutOfBoundsException | | | +-- java . lang . ArrayIndexOutOfBoundsException | +-- java . lang . Error | +-- java . lang . VirtualMachineError | +-- java . lang . OutOfMemoryError |
メソッドが例外をスローしている場合は、それをキャッチするためにtry catchブロックで囲むか、そのメソッドのシグネチャにthrows句を含める必要があります。 シグニチャにthrows句がないと、JavaJVMコンパイラは例外をどう処理するかを認識しません。 throws句は、この特定の例外が呼び出し元のメソッドによって処理されることをコンパイラーに通知します。
以下は、JavaでのThrow、Throws、Try、Catch、Finallyブロックの動作を説明する非常に簡単な例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com . crunchify . tutorials ; import java . io . FileInputStream ; import java . io . FileNotFoundException ; /** * @author Crunchify.com */ public class CrunchifyThrowThrows { @SuppressWarnings ( "unused" ) public static void main ( String args [ ] ) throws Exception { FileInputStream crunchifyStream1 = null ; FileInputStream crunchifyStream2 = null ; String fileName = "Crunchify.txt" ; System . out . println ( "main: Starting " + CrunchifyThrowThrows . class . getName ( ) + " with file name = " + fileName ) ; // get file input stream 1 try { crunchifyStream1 = crunchifyTest1 ( fileName ) ; } catch ( FileNotFoundException ex ) { System . out . println ( "main: Oops, FileNotFoundException caught" ) ; } catch ( Exception ex ) { System . out . println ( "main: Oops, genreal exception caught" ) ; } // get file input stream 2 crunchifyStream2 = crunchifyTest2 ( fileName ) ; System . out . println ( "main: " + CrunchifyThrowThrows . class . getName ( ) + " ended" ) ; } public static FileInputStream crunchifyTest1 ( String fileName ) throws FileNotFoundException { FileInputStream crunchifyStream = new FileInputStream ( fileName ) ; System . out . println ( "crunchifyTest1: File input stream created" ) ; return crunchifyStream ; } public static FileInputStream crunchifyTest2 ( String fileName ) throws Exception { FileInputStream crunchifyStream = null ; try { crunchifyStream = new FileInputStream ( fileName ) ; } catch ( FileNotFoundException ex ) { throw new Exception ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; //System.out.println("crunchifyTest2: Oops, FileNotFoundException caught"); } finally { System . out . println ( "crunchifyTest2: finally block" ) ; } System . out . println ( "crunchifyTest2: Returning from crunchifyTest2" ) ; return crunchifyStream ; } } |
結果:

1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : finally block Exception in thread "main" java . lang . Exception : crunchifyTest2 : Oops , FileNotFoundException caught at com . crunchify . tutorials . CrunchifyThrowThrows . crunchifyTest2 ( CrunchifyThrowThrows . java : 45 ) at com . crunchify . tutorials . CrunchifyThrowThrows . main ( CrunchifyThrowThrows . java : 30 ) |
次に、45行目と46行目を下の行に置き換えて、以下の結果を確認します。
1 2 |
//throw new Exception("crunchifyTest2: Oops, FileNotFoundException caught"); System . out . println ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; |
新しい結果:
1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : Oops , FileNotFoundException caught crunchifyTest2 : finally block crunchifyTest2 : Returning from crunchifyTest2 main : com . crunchify . tutorials . CrunchifyThrowThrows ended |
興味があるかもしれないすべてのJavaチュートリアルのリスト。
例外に関するボーナスのヒント:
- 例外がスローされると、通常のプログラム実行はすぐに分岐します。
- チェックされた例外は、キャッチまたは転送する必要があります。 これは、 try…catchステートメントで実行するか、メソッド定義で例外を定義することで実行できます。
- 例外は、関連付けられた例外クラスがスローされた例外のクラスまたはスーパークラスと一致する最初のcatchブロックによってキャッチされます。
- 例外チェーンに一致するcatchブロックが見つからない場合、スローされた例外を含むスレッドは終了します。
- try…catchステートメントの後のfinallyブロックは、例外がキャッチされたかどうかに関係なく実行されます。
- finallyブロック内に戻ると、キャッチされなかった例外の場合でも、呼び出し元への例外チェーンが切断されます。