Java 例外の概要とアーキテクチャの具体的なコード

黄舟
リリース: 2017-06-18 09:43:02
オリジナル
1291 人が閲覧しました

この記事では主に Java 例外の概要とアーキテクチャを共有します。興味のある方は参考にしてください

Java 例外の概要

Java 例外は、Java の整合性によって提供される識別エラーと応答エラーの一種です。機構。

Java例外メカニズムは、プログラム内の例外処理コードを通常のビジネスコードから分離することができ、プログラムコードがよりエレガントになり、プログラムの堅牢性が向上します。例外が効果的に使用されると、例外は 3 つの質問 何を、どこで、なぜ に明確に答えることができます。例外の種類は「何が」スローされたかを答え、例外スタック トレースはスローされた「どこ」を答え、そして例外情報は「なぜ」を答えます。 「それは投げます。
Java 例外メカニズムで使用されるいくつかのキーワード: try、catch、finally、throw、throws
•try - モニタリングに使用されます。監視対象のコード (例外をスローする可能性のあるコード) を try ステートメント ブロック内に配置します。try ステートメント ブロック内で例外が発生した場合、例外がスローされます。 •catch -- 例外をキャッチするために使用されます。 catch は、try ステートメント ブロックで発生する例外をキャッチするために使用されます。
•finally --finally ブロックは常に実行されます。これは主に、try ブロックで開かれた物理リソース (データベース接続、ネットワーク接続、ディスク ファイルなど) をリサイクルするために使用されます。実行完了後、finally ブロックのみが try または catch ブロック内の return または throw ステートメントを実行します。return または throw などのステートメントがfinally ブロックで使用されている場合、実行には戻りません。直接停止します。
• throw -- 例外をスローするために使用されます。
• throws -- メソッドによってスローされる可能性のある例外を宣言するためにメソッド シグネチャで使用されます。

以下では、いくつかの例を通してこれらのキーワードを簡単に理解します。


例1: try and catchの基本的な使い方を理解する


public class Demo1 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    }
  }
}
ログイン後にコピー

実行結果:


Caught Exceptione.getMessage(): / by zero
e.toString(): java. lang. ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
at Demo1.main(Demo1.java:6)

結果の説明: に 0 の除数があります。 try ステートメントのブロック操作を実行すると、この操作は java.lang.ArithmeticException 例外をスローします。 catch を通じて例外をキャッチします。


結果を観察すると、System.out.println("i="+i) が実行されていないことがわかりました。これは、try ステートメント ブロックで例外が発生した後、try ステートメント ブロックの残りの内容が実行されなくなることを示しています。


例2: finallyの基本的な使い方を理解する「例1」をもとに、finally文を追加します。


public class Demo2 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    } finally {
      System.out.println("run finally");
    }
  }
}
ログイン後にコピー

操作結果:

Caught Exceptione.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java。 lang.ArithmeticException: / by zero
at Demo2.main(Demo2.java:6)
runfinally

結果の説明:finally ステートメント ブロックが最終的に実行されます。


例 3: throws と throw の基本的な使用法を理解する throws はスローされた例外を宣言するために使用され、throw は例外をスローするために使用されます。

class MyException extends Exception {
  public MyException() {}
  public MyException(String msg) {
    super(msg);
  }
}

public class Demo3 {

  public static void main(String[] args) {
    try {
      test();
    } catch (MyException e) {
      System.out.println("Catch My Exception");
      e.printStackTrace();
    }
  }
  public static void test() throws MyException{
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
      throw new MyException("This is MyException"); 
    }
  }
}
ログイン後にコピー
結果 実行結果:


Catch My Exception

MyException: これは、demo3.test (demo3.java:24) の myException

demo3.main (demo3.java:13)



結果の説明:

MyExceptionはExceptionを継承したサブクラスです。 test() の try ステートメント ブロックで ArithmeticException 例外 (除数が 0) が生成され、その例外が catch でキャプチャされ、MyException 例外がスローされます。 main() メソッドは、test() でスローされた MyException をキャプチャします。


Java例外フレームワーク


Java例外アーキテクチャ図

1. Throwable

Throwableは、Java言語のすべてのエラーまたは例外のスーパークラスです。
Throwable には、Error と Exception の 2 つのサブクラスが含まれています。これらは、何か異常なことが起こったことを示すためによく使用されます。
Throwable には、スレッド作成時のスレッド実行スタックのスナップショットが含まれており、スタック トレース データやその他の情報を取得するための printStackTrace() などのインターフェイスが提供されます。



2. Exception

Exception とそのサブクラスは、合理的なアプリケーションがキャッチしたい条件を示す Throwable の形式です。

3. ランタイム例外

RuntimeException は、Java 仮想マシンの通常の動作中にスローされる可能性のある例外のスーパークラスです。
コンパイラはRuntimeExceptionをチェックしません。たとえば、除数がゼロの場合、ArithmeticException がスローされます。 RuntimeException は ArithmeticException のスーパークラスです。コードがゼロで除算される場合、throws ステートメントで ArithmeticException をスローせず、try...catch.... で例外を処理しない場合でも、コードをコンパイルできます。これは、「コンパイラが RuntimeException をチェックしない」と呼ばれるものです。
コードでRuntimeExceptionが発生する場合は、コードを修正して回避する必要があります。たとえば、ゼロによる除算が発生した場合は、コードを使用してこれを回避する必要があります。

4. Error

Exceptionと同様に、ErrorもThrowableのサブクラスです。これは、合理的なアプリケーションが検出すべきではない重大な問題を示すために使用されます。このようなエラーのほとんどは例外的な状況です。
RuntimeException と同様に、コンパイラーはエラーをチェックしません。

Java は、スロー可能な構造を Checked Exception、RuntimeException、Error の 3 つのタイプに分類します。

(01) 実行時例外

定義: RuntimeException とそのサブクラスは実行時例外と呼ばれます。
機能: Java コンパイラーはそれをチェックしません。つまり、プログラム内でこの種の例外が発生する可能性がある場合、その例外が throws ステートメントでスローされず、try-catch ステートメントでキャッチされなければ、コンパイルされます。たとえば、除数がゼロのときに生成される ArithmeticException、配列が範囲外になったときに生成される IndexOutOfBoundsException、フェイルフェイル メカニズムによって生成される ConcurrentModificationException などは、すべて実行時例外です。
Java コンパイラは実行時例外をチェックしませんが、throw を通じて例外を宣言したり、try-catch を通じてキャッチしたりすることもできます。
実行時例外が発生した場合は、コードを修正して回避する必要があります。たとえば、ゼロによる除算が発生した場合は、コードを使用してこれを回避する必要があります。

(02) チェック例外

定義: Exception クラス自体、および「実行時例外」を除く Exception サブクラスの他のサブクラスはすべてチェック例外です。
機能: Java コンパイラーがチェックします。このような例外は、宣言して throw によってスローするか、try-catch によってキャッチして処理する必要があります。そうしないと、コンパイルに合格できません。たとえば、CloneNotSupportedException はチェック例外です。 clone() インターフェイスを介してオブジェクトのクローンが作成され、そのオブジェクトに対応するクラスが Cloneable インターフェイスを実装していない場合、CloneNotSupportedException 例外がスローされます。
チェックされた例外は通常回復可能です。

(03) エラー

定義: エラー クラスとそのサブクラス。
特徴: 実行時例外と同様に、コンパイラーはエラーをチェックしません。
リソースの不足、制約の失敗、またはプログラムの実行を継続できないその他の条件が発生すると、エラーが発生します。プログラム自体ではこれらのエラーを修正できません。たとえば、VirtualMachineError はエラーです。
Java の規則に従って、新しい Error サブクラスを実装すべきではありません。
上記の 3 つの構造について、例外またはエラーをスローする場合はどれを使用する必要がありますか? 「Effective Java」で提供されているアドバイスは、回復可能な状態にはチェック例外を使用し、プログラム エラーには実行時例外を使用することです。

以上がJava 例外の概要とアーキテクチャの具体的なコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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