Java例外処理におけるthrowキーワードとthrowsキーワードの使用法の違いの詳細な説明

高洛峰
リリース: 2017-01-18 14:50:01
オリジナル
2103 人が閲覧しました

例外のスロー
例外のスローには 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

throws は、メソッドが例外をスローする可能性があるというステートメントです。 (メソッドを宣言するときに使用され、メソッドが例外をスローする可能性があることを示します)

構文: [(修飾子)](戻り値の型)(メソッド名)([パラメータリスト])[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 の比較

1. throw はメソッド関数のヘッダーに表示され、throw は関数本体に表示されます。

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 が関数本体。

throw は、この例外がこの場所でスローされることを明確にします。


例:

public void function() throws Exception{......}
ログイン後にコピー


3 つの例外がコード ブロックで生成される可能性があります (Exception1、Exception2、Exception3)。

Exception1 例外が発生した場合、メソッドの呼び出し元によってキャッチされ処理された後にスローされます。
Exception2 例外が発生した場合、メソッドはそれを単独で処理します (つまり、System.out.println("An error happens!");)。したがって、このメソッドは Exception2 例外をスローしなくなり、 void doA() は Exception1 をスローします。Exception3 の Exception2 を記述する必要はありません。

Exception3 例外は、メソッド内の特定の論理エラーです。論理エラーの場合に例外 Exception3 がスローされた場合、メソッドの呼び出し元もこの例外を処理する必要があります。


throw ステートメントは、メソッド本体のステートメントによって処理される例外がスローされることを示すためにメソッド本体で使用されます。

throws ステートメントはメソッド宣言の後に使用され、例外がスローされ、メソッドの呼び出し元によって処理されることを示します。

throws は主に、このメソッドがこのタイプの例外をスローすることを宣言し、その呼び出し元がこの例外をキャッチできるようにします。

throw は例外をスローする特定のアクションなので、例外インスタンスをスローします。

投げは、あなたがその可能性と傾向を持っていることを示しています。
投げたら、あなたはその傾向を現実に変えました。

システム例外の場合は、何もする必要はありません。または、メソッドの例外をスローすることもできます。システム例外はシステムによって自動的にキャッチされるため、この例外をメソッド内で解決する必要があるか、または解決するために上位関数に渡されます。実際、効果は同じです。しかし、多くの情報を確認したところ、例外がスローされてシステムがキャッチできる場合でも、メソッドに throw を記述することをお勧めします。そうすることで、他のプログラマが大規模なメソッドの完了時にどのような例外が発生するかを知ることができるからです。タスク。

それが自己定義の例外の場合、メソッドによってスローされる可能性のある例外をスローするために throws を使用する必要があります。そうしないと、コンパイルでエラーが報告されます。

Java 例外処理における throw キーワードと throws キーワードの使用法の違いについての詳細な説明については、PHP 中国語 Web サイトの関連記事に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート