JavaSE - 例外処理メカニズム

ced485cbb11e458d81a746890b32cf3f.gif

作者:流川メイプルノックコード

ブログホームページ:流川楓のブログ

コラム:私と一緒にJavaを学ぼう

引用:ハングリーでいて、愚かでいて

良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com

クリックして無料で登録し、私と一緒に質問をブラッシングしてください   

記事ディレクトリ

1. 例外の概念とアーキテクチャ

1.1 例外の概念

1.算術例外

2. 範囲外の配列例外

3.ヌルポインタ例外

4. 入力ミスマッチ例外

 1.2 優れたアーキテクチャ

 1.3 例外の分類

1. コンパイル時例外

2.ランタイム例外

2. 例外処理

2.1 スロー例外スロー

2.2 例外のキャプチャ (throw と try-catch)

例外宣言のスロー

try-catch キャッチとハンドル

最後に

3. まとめ


1. 例外の概念とアーキテクチャ

1.1 例外の概念

例外とは何ですか?

Javaでは、プログラムの実行中に発生する異常な動作を例外と呼びます

Java のさまざまなタイプの例外は、対応するクラスによって記述されます。

一般的な例外を次に示します。

1.算術例外

public class Test {
    public static void main(String[] args) {
        System.out.println(10/0);
    }
}

2. 範囲外の配列例外

public class Test {
    public static void main(String[] args) {
        int[] arr = {0,1,2,3};
        System.out.println(arr[100]);
    }
}

3.ヌルポインタ例外

public class Test {
    public static void main(String[] args) {
        int[] arr = null;
        System.out.println(arr.length);
    }
}

4. 入力ミスマッチ例外

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(n);
    }
}

 1.2 優れたアーキテクチャ

Throwable: 例外システムの最上位クラスであり、Error と Exception という 2 つの重要なサブクラスを派生させます。

エラー: Java 仮想マシンでは解決できない重大な問題を指します。たとえば、JVM 内部エラー、リソースの枯渇などです。典型的な代表例: StackOverflowError および OutOfMemoryError

例外: 例外が生成された後、プログラマーはコードを介してそれを処理できるため、プログラムは引き続き実行できます.通常呼び出す例外は Exception です.

 1.3 例外の分類

1. コンパイル時例外

プログラムのコンパイル中に発生する例外 (コンパイル時例外、チェック済み例外とも呼ばれます)

プログラムをコンパイルする場合、コンパイルを続行する前に例外を処理する必要があります。

class Person{
    private String name;
    private String gender;
    int age;

        //想要让该类支持深拷贝,覆写Object类的clone方法即可
    public Person clone(){
        return (Person)super.clone();
    }
}

2.ランタイム例外

プログラムの実行中に発生する例外 (実行時例外、非チェック例外とも呼ばれます)

ランタイムとは、プログラムがコンパイルされてクラス ファイルが取得された後、JVM によるプログラムの実行中に発生するエラーを指します。

RunTimeException とそのサブクラスの対応する例外は、実行時例外と呼ばれます。例: NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException

2. 例外処理

例外処理の 5 つの主なキーワード: throw、try、catch、final、throws

2.1 スロー例外スロー

Java では、throw キーワードを使用して指定された例外オブジェクトをスローし、呼び出し元にエラー メッセージを通知できます。具体的な構文は次のとおりです。

throw new XXXException("异常产生的原因");

次に、例外をスローするコードを記述します

public class Test {
    public static void main(String[] args) {
        int[] arr = null;
        test(arr);

    }
    public static void test (int[] arrays){
        if(arrays == null){
            throw new NullPointerException("传递的数组为null");
        }
    }

}

予防:

1. throw はメソッド本体内に記述する必要があります

2. スローされるオブジェクトは、Exception または Exception のサブクラスである必要があります。

3. RunTimeException または RunTimeException のサブクラスがスローされた場合、それを処理せずに JVM で直接処理できます。

4. コンパイル時の例外がスローされた場合、ユーザーはそれを処理する必要があります。そうしないと、コンパイルは失敗します。

5. 例外がスローされると、後続のコードは実行されません

2.2 例外のキャプチャ (throw と try-catch)

例外をキャプチャする主な方法、つまり例外の具体的な処理方法には、例外宣言のスローと try-catch キャプチャ処理の 2 つがあります。

例外宣言のスロー

現在のメソッドは例外を処理せず、例外を処理するメソッドを呼び出し元に思い出させます

つまり、メソッドでコンパイル時の例外がスローされ、ユーザーが例外を処理したくない場合、この時点で、スローを使用してメソッドの呼び出し元に例外をスローできます。

语法格式:
修饰符 返回值 类型 方法名(参数列表) throws 异常类型1,异常类型2...{
        //...
}

予防

1. スローはメソッドのパラメーター リストに従う必要があります

2. 宣言された例外は、Exception または Exception のサブクラスでなければなりません

3. メソッド内で複数の例外がスローされる場合、throws の後に複数の例外の種類をコンマで区切る必要があります.複数の例外の種類がスローされ、親子関係がある場合は、親クラスを直接宣言できます。

4. 例外をスローするように宣言されたメソッドを呼び出す場合、呼び出し元は例外を処理するか、引き続きスローを使用してスローする必要があります。 

public class Test {
    public static void main(String[] args) throws Exception {
        int[] arr = null;
        test(arr);

    }

    public static void test(int[] arrays) throws Exception{
        if(arrays == null){
            throw new NullPointerException();
        }
    }

}

 test が例外を宣言するだけでそれを処理しない場合、呼び出し元、つまりメイン関数を検索し、それを処理しないと、JVM が例外を処理します。

try-catch キャッチとハンドル

throws は実際には例外を処理しませんが、例外をスローしたメソッドの呼び出し元に例外を報告し、呼び出し元がそれを処理します。本当に例外を処理したい場合は、try-catch が必要です

構文形式:

 try {
            //将可能出现异常的代码放在这里
            //可能会抛出异常,也可能不会
}catch(要捕获的异常类型 e){

            //如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
            //对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}

予防:

1. try ブロックで例外がスローされた後のコードは実行されません

public class Test {
    public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
            System.out.println("hello world");
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    }
}

出力なし hello world 

2. スローされた例外のタイプがキャッチ時の例外のタイプと一致しない場合、つまり、例外は正常にキャッチされず、処理されず、JVM が受け取るまでスローし続けます。プログラムを中断します - 例外はタイプに基づいています。

スローされた例外のタイプは、キャッチされたときの例外のタイプと一致しません:

public class Test {
    public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
            System.out.println("hello world");
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }
}

3. 複数の異なる例外オブジェクトが try でスローされる可能性があり、それらをキャプチャするには複数の catch を使用する必要があります。つまり、複数の例外、複数のキャプチャです。

public class Test {
    public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
            System.out.println("hello world");
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } catch (NullPointerException e){
            e.printStackTrace();
        } catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }
}

複数の例外の処理はまったく同じで、次のように書くこともできます。

public class Test {
    public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
            System.out.println("hello world");
        } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } 
    }
}

例外には親子関係があり、サブクラスの例外は前に、親クラスの例外は後ろにキャッチしなければならない、そうでなければ構文が間違っています。

 public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
            System.out.println("hello world");
        } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

例外はすべての例外をキャッチします

最後に

プログラムが異常であるかどうかに関係なく、特定のコードを実行する必要がある; プログラムが正常終了または異常終了したときに、リソースを回復する必要がある; 例外によってプログラムのジャンプが発生し、一部のステートメントの実行に失敗する可能性がある. finally キーワードを使用するには

構文形式

try {
          //...
          
}catch(要捕获的异常类型 e){

            //...
}finally{

        //此处的语句无论是否发生异常,都会被执行到
        //如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行
}
public static void main(String[] args) throws Exception {

        try {
            int[] arr = null;
            System.out.println(arr[3]);
        } catch (ArithmeticException | NullPointerException |ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } finally {
            System.out.println("hello world");
        }
    }

 finally 実行のタイミングはメソッドが戻る前です (try または catch で return がある場合は、finally が return の前に実行されます) ただし、finally に return ステートメントもある場合は、finally の return が実行されます。トライが実行されないように Zhongyuan のリターン

3. まとめ

        A program execute the code in the try first. try のコードに例外がある場合は、try のコードを終了して、catch の例外の種類と一致するかどうかを確認します。一致する例外の種類が見つかった場合、キャッチ内のコードが実行されます。一致する例外タイプが見つからない場合、例外は上位の呼び出し元に渡されます。一致する例外の種類が見つかるかどうかに関係なく、finally のコードが (メソッドが終了する前に) 実行されます。上位レベルの呼び出し元が例外を処理しない場合、main メソッドが例外を処理するための適切なコードを持たなくなるまで例外は渡され続け、処理のために JVM に渡され、その時点でプログラムは終了します。異常に。

「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!

ced485cbb11e458d81a746890b32cf3f.gif

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/126430490