P444~P459
クイックスタート、com.例外_.例外01.java
package com.exception_;
public class exception01 {
public static void main(String[] args) {
int num1=10;
int num2=0;
try {
int res=num1/num2;
} catch (Exception e) {
e.printStackTrace();//java.lang.ArithmeticException: / by zero
System.out.println(e.getMessage());/// by zero
}
System.out.println("程序继续执行");
}
}
//因为num2=0,程序就会抛出异常 ArithmeticException
//当抛出异常程序就退出,下面的代码不执行
Java言語では、プログラム実行中に発生する異常事態を例外と呼びます。
異常事態は次のように分類されます。
エラー:
Java 仮想マシンでは解決できない重大な問題。例: JVM システムの内部エラー、リソースの枯渇、その他の深刻な状況。
例: StackOverflowError [スタック オーバーフロー] および OOM (メモリ不足)、エラーは重大なエラーであり、プログラムはクラッシュします。
例外:
エラーや偶発的な外部要因によって引き起こされるその他の一般的な問題は、特定のコードを使用して処理できます。たとえば、null ポインタ アクセス、存在しないファイルの読み取り試行、ネットワーク接続の中断など。例外は、実行時例外とコンパイル時例外の 2 つのカテゴリに分類されます。
一般的なランタイム例外
-
NullPointerException: null ポインタ例外
アプリケーションがオブジェクトが必要な場所で null を使用しようとするとスローされます
-
ArithmeticException: 数学演算例外
-
ArrayIndexOutOfBoundsException: 配列の添字が範囲外の例外
不正なインデックスを持つ配列にアクセスすると例外がスローされます。インデックスが負の場合、または配列のサイズ以上の場合、そのインデックスは不正なインデックスです。
-
ClassCastException: 型変換例外
インスタンスではないサブクラスにオブジェクトをキャストしようとするとスローされます
-
NumberFormatException: 数値形式が正しくない例外
アプリケーションが文字列を数値型に変換しようとしたが、文字列を適切な形式に変換できない場合、例外を使用して入力が数値であることを確認できます。
String name = "1234";
//将String转int
int num = Integer.parseInt(name);
String name2 = "a";
int num2 = Integer.parseInt(name2);//NumberFormatException
一般的なコンパイル例外
- SQLException: データベース操作時にクエリテーブルで例外が発生する場合があります。
- IOException: ファイル操作時に例外が発生しました
- FileNotFoundException: 存在しないファイルを操作すると例外が発生します
- ClassNotFoundException: 存在しないクラスをロードする場合
- EOFException: 堅牢な操作、ファイルの終わりに達しました
- IllegalArgumentException: 引数の例外
例外処理
例外処理とは、例外が発生したときに例外を処理する方法です。
例外の処理方法
トライ・キャッチ・最後に
コード内の例外をキャッチして自分で処理する
try{
可能有异常代码
}catch(Exception e){
捕获到异常
//当异常发生时,系统将异常分装成Exception对象e,传递给catch
//程序员可以自己处理异常
//如果try中没有发生异常,则catch代码块不执行
}finally{
//不管try代码块中是否有异常发生,始终要执行finally
//通常将释放资源的代码放在finally中
}
投げる
発生した例外をスローし、処理のために呼び出し元 (メソッド) に渡します。最上位のハンドラーは JVM です。
JVM 调用 main
main 调用 f1()
f1() 调用 f2()
f2()代码块发生异常,
f2可以用try-catch,或抛出给上一级
f2抛出异常,throws到f1,
f1可以用try-catch,或抛出给上一级
f1抛出异常,throws到main,
main可以用try-catch,或抛出给上一级
main抛出异常,throws到JVM,
JVM输出异常信息,退出程序
トライ・キャッチ・スローのいずれかを選択
プログラマが例外を明示的に処理しない場合、デフォルトでは次の例外がスローされます。
トライキャッチ
Java には例外を処理するための try ブロックと catch ブロックが用意されており、try ブロックは問題が発生する可能性のあるコードを含めるために使用され、catch ブロックは try ブロックで発生した例外を処理するために使用されます。
try{
//可疑代码
//将异常生成对应异常对象传递给catch块
}catch(异常){
//对异常进行处理
}
//没有finally语法可以通过
詳細
- 例外が発生した場合、例外の背後にあるコードは実行されず、直接 catch ブロックに入ります。
- 例外が発生しない場合、try のコード ブロックは順番に実行され、catch には入りません。
- 例外が発生するかどうかに関係なく、特定のコードを実行したい場合は、finally を使用します。
- 異なる例外をキャッチするために複数の catch ステートメントを使用できます。親クラスの例外の後にサブクラスの例外が続く必要があります。たとえば、Exception の後に NullPointerException が続く必要があります。例外が発生した場合、1 つの catch のみが一致します。
- try-finally と組み合わせて使用できます。例外が発生するとプログラムはクラッシュしますが、必ずfinallyで実行されます。例外が発生するかどうかに関係なく、finallyのビジネス ロジックは必ず実行されます。
例外処理をスローします
- メソッドが何らかの種類の例外を生成する可能性があるが、その例外を処理する方法が不明な場合、メソッドは例外がスローされることを明示的に宣言し、メソッドがこれらの例外を処理しないことを示し、メソッドの呼び出し元が責任を負う必要があります。それらを扱うために
- メソッド内で throws ステートメントを使用して、スローされる例外のリストを宣言します。 throws の背後にある例外タイプは、メソッドまたはその親クラスで生成された例外タイプです。
詳細
- コンパイル例外の場合は、try-catch または throws を使用してプログラム内で処理する必要があります。
- 実行時例外の場合、プログラム内に処理がない場合は、デフォルトの throws メソッドが処理されます。
- サブクラスが親クラスのメソッドをオーバーライドする場合、例外をスローするための規則が適用されます。サブクラスによって書き換えられたメソッドによってスローされる例外のタイプは、親クラスによってスローされる例外のタイプと同じか、親クラスによってスローされる例外のタイプのいずれかになります。親クラスのサブタイプ
- throwの過程でtry-catchメソッドがあれば例外処理に相当し、throwは必要ありません
カスタム例外
プログラム内で何らかのエラーが発生したが、そのエラー情報が Throwable のサブクラスにない場合、例外をカスタマイズできます。
- 定義クラス: カスタム例外クラス名、Exception または RuntimeException を継承
- Exceptionを継承した場合、それはコンパイル例外となり、コンパイル例外を表示して処理する必要があります。
- RuntimeExceptionを継承すると実行例外となり、通常は実行例外化されるため、デフォルトの処理機構を利用できる点がメリットとなります。
投げと投げの違い
投げる
- 例外を処理する方法
- 場所: メソッド宣言
- 例外の種類が続きます
投げる
- 例外オブジェクトを手動で生成するためのキーワード
- 場所: メソッド本体内
- その後に例外オブジェクトが続きます