Javaの異常なメカニズムについて話す

Huaweiクラウドコミュニティからのこの記事を共有してください「Java例外メカニズムは問題の知識を特徴としていました」、原作者:breakDraw。

Java例外とは、プログラムの実行中に発生する可能性のあるいくつかのエラーを指します。たとえば、ファイルが見つからない、ネットワーク接続の失敗、不正なパラメーターなどです。例外は、プログラムの実行中に発生し、実行中のプログラムの通常の命令フローを中断するイベントです。

Javaは、APIのThrowableクラスの多くのサブクラスを通じてさまざまな例外を記述します。したがって、Java例外はすべてのオブジェクトであり、Throwableサブクラスのインスタンスであり、コードの一部に現れるエラー状態を記述します。条件が生成されると、エラーによって例外が発生します。ランタイム例外、エラー、またはチェック可能な例外の場合、Javaテクノロジで必要な例外処理方法は異なります。

異常なシステム分類

Q:ThrowableとErrorの関係
A:ThrowableはErrorの基本クラスであり、Exceptionの基本クラスでもあります。
良い画像です。一般的な例外とエラーを確認できます。

Q:エラーと例外の関係
A:

  • エラーは通常、Java仮想マシンの実行エラーなど、jvmエラーを直接引き起こすエラーです。現在のスレッドが表示された場合、そのスレッドは実行を継続しません。
  • Excpetionは、プログラム自体で処理できる例外です。それが起こった後でも、それはまだ正常に動作することができます。

Q:エラーはcatchでキャッチできますか?
A:Throwableとそのサブクラスである限り、投げたりキャッチしたりできます。ただし、エラーをキャッチすることはお勧めしません。

例外システムは、次の2つのカテゴリに分類することもできます。

  • チェックされていない例外(チェックされていない例外)
    は、一般的なNullPointerException、IndexOutOfBoundsExceptionなど、ランタイム例外(RuntimeException)とも呼ばれます。実行時例外の場合、Javaコンパイラーは例外キャプチャー処理や宣言のスローを必要とせず、決定するのはプログラマー次第です。
  • チェックされた例外(チェックされた例外、コンパイルされた例外)
    は、非ランタイム例外とも呼ばれます(ランタイム例外以外の例外は非ランタイム例外です)。Javaコンパイラーは、プログラマーに一般的なIOExeptionやSQLExceptionなどの処理をキャプチャするように強制します。実行時以外の例外の場合、宣言処理をキャプチャまたはスローしないと、コンパイルはパスしません。

例外のキャッチアンドリターン

Q:リターン-最終的にトラップ1:変数を変更することで、リターンの変数値を最終的に更新できますか?

int f() {
  int a = 1;
  try {
      return a;
  }
  finally {
      a=2;
  }
}

A:いいえ、fは1を返します。

Q:リターン-ファイナルトラップ2:ファイナルにリターンがある場合、どちらが返されますか?

int f() {
  try {
      return 1;
  }
  finally {
      return 2;
  }
}

A:最後に戻り、2を返します。

Q:どのような状況でfinallyブロックのステップを実行できませんか?
A:System.exit(0)を呼び出してjvmを終了するだけで、最終的に実行できなくなります。

Q:次に何が起こりますか?

try {
    start();
} catch (Exception ex) {
    System.out.println("catch Exception");
} catch (RuntimeException re) {
    System.out.println("catch RuntimeException");
}

A:直接コンパイルするのはエラーです。キャッチは順番に行われ、1つの一致が一致した場合、それ以上の一致は行われません。したがって、コンパイラーは、RuntimeExcpetionがキャッチされないことを認識し、事前にエラーを報告します。

Q:例外をスローするとき、最後に戻ってきますか?それから例外がスローされますか?

static int f() {
    try {
        int a = 1/0;
        return a;
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        return -1;
    }
}
public static void main(String[] args) {
    System.out.println(f());
}

A:いいえ、-1を返します。

つまり、finalでreturnを実行するとスローが中断される
ため、finalでreturn操作を実行しないでください。

チェックされた例外に関連する問題

Q:サブクラスが基本クラスのメソッドをオーバーライドする場合、基本クラスのメソッドに存在しない例外をスローできますか?
次のように:

class A{
    void f() throws IOException{
    }
}
class B extends A{
    void f() throws IOException, SQLException {
    }
}

A:いいえ、直接コンパイルしてエラーを報告するだけです。つまり、サブクラスがスーパークラスメソッドを上書きする場合、throwsキーワードに続く例外は、スーパークラスメソッドの例外以下である必要があります。

Q:リソースのクローズがfinallyで呼び出されると、チェックされた例外もスローされます。finallyでtry-catchを実行する以外に、他に何ができますか?

次のように、最終的に醜いキャッチがあります:

TryWithResource tryWithResource = new TryWithResource();
        try {
            System.out.println(tryWithResource.age);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                tryWithResource.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

A:JDK1.7の場合は、try-with-resource構文を使用できます。

リソースクラスは、次のように、AutoCloseableインターフェイスを実装し、試行時に試行ブラケットの後にリソースの作成に従う必要があります。

    public static void main(String[] args) {
        try (TryWithResource tryWithResource = new TryWithResource()) {
            System.out.println(tryWithResource.age);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

したがって、finallyを記述する必要はありません。finally+ closeは、コンパイラーによって自動的に追加されます。

Q:スレッドが例外をスローした場合に例外をキャッチするにはどうすればよいですか?

A:例外処理インターフェースMyUnchecckedExceptionhandlerを実装します

public class MyUnchecckedExceptionhandler implements UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("捕获异常处理方法:" + e);
    }
}

次に、実装クラスを対応するスレッドに設定します。

Thread t = new Thread(new ExceptionThread());
t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
t.start();

 

クリックしてフォローし、Huawei Cloudの新しいテクノロジーについて初めて学びましょう〜

おすすめ

転載: blog.csdn.net/devcloud/article/details/115321108