Java で例外タイプを処理する方法

WBOY
リリース: 2023-04-28 18:46:07
転載
1321 人が閲覧しました

1. 例外の説明

プログラムの実行中に予期しないイベントが発生し、プログラマの期待どおりにプログラムが正常に実行されない場合、これは例外です。例外が発生すると、プログラムは自動的に対処し、ただちに終了します。 Java の場合、Java のコンパイル中、操作中、または操作中に発生するエラー。

Java は、例外処理メカニズムというより優れたソリューションを提供します。

例外処理メカニズムを使用すると、例外が発生したときにプログラムがコードの事前設定された例外処理ロジックに従って対象を絞った方法で例外を処理できるため、プログラムは通常に戻り、可能な限り実行を継続できます。コードの明瞭さを維持しながら。

Java の例外は、関数内のステートメントが実行されるときに発生することも、プログラマが throw ステートメントを通じて手動でスローすることもできます。Java プログラムで例外が発生する限り、例外は対応する型のオブジェクトは例外をカプセル化するために使用され、JRE は例外を処理する例外ハンドラーを見つけようとします。

  • 例外とは、実行時に発生する異常な状況を指します。

  • 異常な状況が説明され、オブジェクトは Java のクラスの形式でカプセル化されます。

  • #異常な状況を記述するクラスは例外クラスになります。

  • 通常のコードと問題処理コードを分離して、読みやすさを向上させます。

  • 実際、例外とは、Java がオブジェクト指向の考え方を通じて問題をオブジェクトにカプセル化し、例外クラスを使用して問題を記述するものです。

2. 例外システム

2 つの主要カテゴリ:

  • hrowable: エラーかどうかに関係なく、スローされる可能性のある例外または、呼び出し元がそれを認識して処理できるように、問題が発生したときに例外をスローする必要があります。

  • このシステムの特徴は、Throwable とそのすべてのサブクラスがスロー可能であることです。

スローアビリティとは正確には何を意味しますか?スローアビリティを反映するにはどうすればよいですか?

  • は 2 つのキーワードに反映されています。

  • throws throw これら 2 つのキーワードで操作できるすべてのクラスとオブジェクトはスロー可能です。

  • サブカテゴリ 1 通常は処理できません。 ————エラー

  • 特徴: これは jvm によってスローされる深刻な問題です。この種の問題が発生した場合、通常は的を絞った方法で対処されず、プログラムは直接変更されました。

  • サブクラス 2)​​ はそれを処理できます。 ——例外として、問題は、誰が誰に投げても、呼び出し元に投げられます。

  • 特徴: サブクラスの接尾辞名にはすべて親クラスの名前が接尾辞として付けられており、非常に読みやすくなっています。

例: たとえば、オブジェクト指向の考え方を使用して、負のインデックスを使用して例外をカスタマイズし、それをオブジェクトにカプセル化します。

  • 注: クラスが例外クラスと呼ばれる場合、そのクラスは例外クラスを継承する必要があります。例外システムのサブクラスのみがスロー可能であるためです。

class FuShuIndex extends Exception{
                //构造函数 和类名一样
                FuShuIndex(){  
                }
                //定义一个带参数的构造函数
                FuShuIndex(String msg){
                    //调用Exception中的带参数异常函数
                    super(msg);  
                }
            }
            主函数 throws FuShuIndex:{
               int[] arr = new int[3];
               method(arr,-7);
            }
            public static int method(int[] arr,int index) throws arrIndexexception {
                 if (index<0){
                    throw new arrIndexexception("数组的角标不能为负数");
                 }
                return arr[index];
            }
ログイン後にコピー
3. 例外分類:

コンパイル中に検出された例外も、処理が失敗せずにコンパイルされる特別なサブクラス RuntimeException を除き、Exception とそのサブクラスです。

  • この種の問題が発生すると、コンパイル時に検出して、この種の問題に応じて対処できるようにしたいと考えています。やり方。

コンパイル中に検出されない例外 (実行時例外): RuntimeException とそのサブクラス

  • は処理できるかどうか、およびコンパイルに合格する可能性があります。実行時に検出されます!

  • このような問題は、関数の続行ができず操作が実行できないという問題が発生しますが、その多くは呼び出しや内部状態の変化によって発生します。この種の問題は通常は対処されず、直接コンパイルされて渡されますが、実行時にプログラムは呼び出し元によって強制的に停止され、呼び出し元がコードを修正できるようになります。

throws と throw の違い:

  • throws は関数で使用されます ————ステートメント

  • throw は関数内で使用され、カンマで区切って複数のスローをスローできます。 ——Throws

  • throws は例外クラスをスローし、複数の例外をスローできます。

  • throw は例外オブジェクトをスローします。

4. 例外処理のキャプチャ形式

これは、対象を絞った方法で例外を処理する方法です。

形式:

try{
            //需要被检测异常的代码
        }
        catch(异常类 变量)//该变量用于接收发生的异常对象{
            //处理异常代码
        }
        finally{
            //一定会被执行的代码
      }
ログイン後にコピー

class FuShuIndex extends Exception{
            //构造函数 和类名一样
            FuShuIndex(){  
            }
            //定义一个带参数的构造函数
            FuShuIndex(String msg){
                //调用Exception中的带参数异常函数
                super(msg);  
            }
  }
ログイン後にコピー
メイン関数: スローの必要はありません。例外を自分でキャッチしましょう。

{
           int[] arr = new int[3];
           try{
           method(arr,-7);
           }catch(arrIndexexception a){
                a.printStackTrace();//jvm默认的异常处理机制就是调用异常对象的这个方法。
                System.out.println("数组的角标异常!!!");//自定义捕获后打印的信息
                System.out.println(a.toString());//打印该异常对象的信息
                System.out.println(a.getMessage());//获取我们自定义抛出所定义的信息
                }
  }
public static int method(int[] arr,int index) throws arrIndexexception {
             if (index<0){
                throw new arrIndexexception("数组的角标不能为负数");
             }
            return arr[index];
 }
ログイン後にコピー
1 回の試行が複数のキャッチに対応します。

  • 複数のキャッチの場合、親クラスのキャッチを最後に配置する必要があります。そうしないと、コンパイルが空になります。

5. 例外処理の原則

検出する必要のある例外が関数内でスローされた場合、その例外を関数内で宣言するか、関数内で宣言する必要があります。関数内の try catch でキャッチされます。それ以外の場合、コンパイルは失敗します。

例外を宣言する関数が呼び出された場合は、catch または throws を試行してください。そうでない場合、コンパイルは失敗します。

いつ捕まえる?いつ投げますか?

  • 関数の内容は catch を使用することで解決できます。

  • 解決できない場合は、throw を使用して呼び出し元に通知すると、呼び出し元が解決します。

一个功能如果抛出了多个异常,那么调用时,必须有对应的多个catch来进行针对性处理。

  • 内部有几个需要检测的异常,就抛几个异常,抛出几个就catch几个异常。

六、finally

通常用于关闭(释放)资源。必须要执行。除非jvm虚拟机挂了。

范例:出门玩,必须关门,所以将关门这个动作放在finally里面,必须执行。

凡是涉及到关闭连接等操作,要用finally代码块来释放资源。

try catch finally 代码块组合特点:

  • try catch finally:当有资源需要释放时,可以定义finally

  • try catch(多个):当没有资源需要释放时,可以不定义finally

  • try finally:异常处理不处理我不管,但是我得关闭资源,因为资源是我开的,得在内部关掉资源。

范例:

try{
                    //连接数据库
                }
                    //没有catch意思不处理异常,只单纯的捕获异常
                finally{
                    //关闭连接
                }
ログイン後にコピー

七、异常的应用

老师用电脑讲课范例:

电脑类:

public class Computer {
                private int state = 2;
                public void run() throws lanpingExcption,maoyanExcption{
                    if (state == 1){
                        throw new lanpingExcption("电脑蓝屏啦~");
                    }else if (state == 2){
                        throw new maoyanExcption("电脑冒烟啦~");
                    }
                    System.out.println("电脑启动");
                }
                public void chongqi(){
                    state = 0;
                    System.out.println("重启电脑!");
                }
  }
ログイン後にコピー

老师类:

public class Teacher {
            private String name;
            private Computer computer;
            Teacher(String name){
                this.name = name;
                computer = new Computer();
            }

            void teach() throws maoyanExcption{
                try {
                    computer.run();
                    System.out.println(this.name + "开始用电脑讲课了");
                } catch (lanpingExcption l) {
                    l.printStackTrace();
                    computer.chongqi();
                    teach();//重启后再次讲课
                } catch (maoyanExcption m) {
                    m.printStackTrace();
                    test();
                    throw m;
                }
            }

            public void test(){
                System.out.println("大家自己练习去~");
            }

  }
ログイン後にコピー

蓝屏异常类:

public class lanpingExcption extends Exception{
            lanpingExcption (String msg){
                 super(msg);
            }
 }
ログイン後にコピー

冒烟异常类:

public class maoyanExcption extends Exception {
            maoyanExcption (String msg){
                super(msg);
            }
}
ログイン後にコピー

主函数:

public class Testmain {
            public static void main (String[] args){
                Teacher teacher = new Teacher("丁老师");
                try {
                    teacher.teach();
                } catch (maoyanExcption m) {
                    //m.printStackTrace();
                    System.out.println("。。。。。");
                }
            }
    }
ログイン後にコピー

八、异常的注意事项:

  • 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。

  • 如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

  • 子类覆盖父类,只能抛出父类的异常或者子类。

  • 如果父类的方法没有抛出异常,子类覆盖时绝对不能抛。

以上がJava で例外タイプを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート