異常なキャプチャと処理
Javaは例外の処理に強力です
プログラムへの異常の影響を認識する
例外とは、プログラムの中断の原因となった命令ストリームを指します。
エラーが発生した後、プログラム全体が意図した方法で実行されませんが、実行は中断されます。致命的でないエラーが発生した後もプログラムを正常に完了できるようにするため、プログラムのスムーズな進行を保証します。
例外を処理する
Javaでの例外処理は、キーワードtry、catch、finallyを使用して実行できます。基本的な処理構造は次のとおりです。
try{
// 可能出现异常的语句
}[catch (异常类型 异常对象){
// 异常处理
}
catch (异常类型 异常对象){
// 异常处理
}...][finally{
// 不管异常是否处理都要执行
}]
使用できる組み合わせ:try ... catch、try ... catch ... final、try ... final。
この時点で、例外が処理されると、出力は例外クラスのオブジェクトになります。オブジェクトが直接出力され、取得された例外情報が不完全です。完了した例外情報を取得する場合は、例外クラスで提供されているprintStackTrace()メソッドを使用して完了できます。
例外処理形式の場合、プログラムが異常であるかどうかに関係なく、最後にfinallyブロックを追加して、例外処理の終了を示すこともできます。
複数の例外の処理
いくつかの例外が生成されます。この場合、複数のキャッチを使用して例外をキャプチャすることもできます。
例外タイプ:
- パラメータの入力を忘れた:配列の範囲外の例外
- 入力タイプエラー:異常な数値形式
- 異常なデータ:配当は0であってはなりません
例外処理プロセス
例外処理を実行すると、生成されたことが明確にわかっている可能性のあるすべての例外がキャプチャされます。優れたコード構造は得られますが、この種のコードの記述は非常に面倒なので、合理的な例外を作成する場合は、クリアする必要があります。例外が生成された後、プログラムは何をしましたか?
- 例外はプログラムの実行中にのみ発生し、プログラムの実行中に例外が発生すると、指定されたタイプの例外クラスオブジェクトが自動的にインスタンス化されます。
- 現時点でプログラムが例外処理のサポートを提供していない場合、プログラムはJVMのデフォルトの例外処理を使用し、最初に例外情報を出力してから実行を終了します。
- この時点でプログラムが例外処理を提供している場合、生成された例外クラスのインスタンス化されたオブジェクトは、tryステートメントによってキャプチャされます。
- tryが例外をキャッチした後、一致したcatch例外タイプとの比較を実行します。一致した場合、catchは例外処理に使用されます。一致が成功しなかった場合、例外を処理できないことを意味します。
- 最後に、finallyステートメントが実行されます。finallyが完了した後、現在の例外が処理されたかどうかがさらに判断され、処理されている場合は引き続き実行され、処理されていない場合は渡されます。デフォルトの処理のためにJVMに転送します。
例外処理全体では、実際の操作は依然として例外クラスのインスタンス化されたオブジェクトであるため、この例外クラスのインスタンス化されたオブジェクトタイプは、例外処理を理解するためのコアキーになります。
プログラムで処理できる最大の種類の例外はThrowableで、これには2つのサブカテゴリがあります。
- エラー:この時点でプログラムが実行されておらず、開発中に処理できない場合にエラーが発生しました。
- 例外:開発者はプログラムで例外を処理できます。
分析により、例外が発生したときに例外を生成するインスタンス化されたオブジェクトは、オブジェクト参照の原則に従って、自動的に親クラスに変換できることがわかります。このロジックに従って、すべての例外は次の方法で処理できます。例外。
catch(Exception e){
e.printStackTrace();
}
生成される例外がわからない場合は、簡単に処理できます。エラー情報の記述が明確でないため、例外を個別に処理する方が便利でわかりやすくなります。
将来、複数の例外が同時に処理される場合、キャプチャ範囲が大きい例外は、キャプチャ範囲が小さい例外の後に配置する必要があります。
キーワードをスローします
前のプログラムでは、プログラムの実行時に例外が生成される場合があります。メソッドが定義されていると仮定すると、どの例外が生成されるかをユーザーに明確に伝える必要があります。この時点で、メソッド宣言でthrowsキーワードを使用して、例外タイプをマークできます。
class Math{
//这个代码执行时可能会产生算术异常,如果产生异常"调用处"处理
public static int div(int x, int y) throws ArithmeticException{
return x/y;
}
}
main throws Exception{
//主方法向上抛出异常
Math.div(10,2);
}
mainメソッド自体もメソッドであり、生成された例外を上向きにスローすることもできます。つまり、JVMが例外の処理を担当します。
キーワードを投げる
スローとは、手動で例外をスローすることを意味します。このとき、例外のインスタンス化されたオブジェクトが手動で生成され、例外がスローされます。
main{
try{
//异常对象是手工定义的
throw new Exception("自己跑着玩的对象。");
} catch(Exception e){
e.printStackTrace();
}
}
インタビュー:スローとスローの違いを説明してください。
- throw:主に例外オブジェクトを手動でスローするためにコードブロックで使用されます。
- Throws:はメソッド定義で使用されます。これは、このメソッドが生成する可能性のある例外が呼び出し元に明確に通知され、呼び出し元によって処理されることを意味します。
例外処理モデル
class Math{
//这个代码执行时可能会产生异常,如果产生异常"调用处"处理
public static int div(int x, int y) throws Exception{
int temp = 0;
print("start");
try{
temp = x/y;
} catch(Exception e){
throw e; //向上抛异常对象
} finally{
print("end");
}
return temp;
}
}
main{
try{
Math.div(10,2);
} catch (Exception e){
e.printStackTrace();
}
}
このタイプの場合、Mathのcatchは省略できます。このタイプの例外処理形式は、実際の開発(リソースアクセス)で非常に重要です。
RuntimeException
メソッドがスローしている限り、どのような種類の例外が発生したかをユーザーに通知します。
現在のプログラム実行で、throwsで定義されたメソッドが使用されている限り、開発者が手動で処理する必要がある場合、コードは煩雑すぎるため、設計プロセスでは、親クラス「RuntimeException」を処理する柔軟なオプションの例外が提供されます。例外のサブクラス必須の処理を必要としない場合があります。
インタビュー:RuntimeExceptionとExceptionの違いを説明してください。一般的なRuntimeExceptionを一覧表示します。
- RuntimeExceptionはExceptionのサブクラスです。
- RuntimeExceptionでマークされた例外は必須の処理を必要としませんが、Exception例外は必須である必要があります。
- 常见:NumberFormatException、ClassCastException、NullPointerException
カスタム例外クラス
JDKは多数の例外タイプを提供しますが、実際の開発では不十分な場合があります。現時点では、カスタム例外タイプを検討してください。
2つの実装スキーム:ExceptionまたはRuntimeExceptionを継承します。
class BombException extends Exception{
public BombException(String msg){
super(msg);
}
}
class Food{
public static void eat(int num) throws BombException{
if(num > 10 ){
throw new BombException("TOO MUCH");
} else{
print("normal");
}
}
}
主張する
JDK1.4以降、特定の行を実行した後、コードが期待どおりの結果である必要があることを確認するアサーション関数が追加されています。実際の開発アサーションは正しくない可能性があり、偏差がある可能性がありますが、この偏差は通常の実行に影響を与えません。プログラムの。
アサーションは、プログラムがJavaで実行する必要のあるステップとして設定されておらず、特定の環境でオンにすることができます。