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();