JavaSE例外処理のJavaSEコアテクノロジー

JavaSE例外処理のJavaSEコアテクノロジー

異常なプロファイル

Javaでは、例外はJavaがコンパイル、実行、または実行されるときに発生するエラーです。

3個の手続きのエラーがあります:コンパイルエラー実行時エラー論理エラーは、

  • コンパイルエラーは、プログラムが文法規則に準拠していないために発生します。コンパイラは、エラーの理由と場所を自動的に見つけて通知することができます。これは、初心者がプログラミング言語を初めて使用するときによくある問題でもあります。
  • 実行時エラーは、プログラムが実行されると、実行環境が実行できない操作を見つけるためです。
  • 論理エラーは、プログラムが予期された論理順序で実行されないためです。例外とは、プログラムの実行中に発生するエラーを指し、例外処理はこれらのエラーを処理および制御することです。

以下のコードを見てみましょう

package com.yichang;

public class Test {
    public static void main(String[] args) {
        System.out.println(1/0);//0不能做除数
    }
}

复制代码

実行後の結果は次のとおりです

プログラムに問題があることがわかりました。図のエラーメッセージは、次の2つのことを示しています。

  • 何が悪かった
  • エラーの場所

異常なプロセス

上記のコードを例にとると、プログラムが実行されているとき、最初にmainメソッドを実行し、次に1/0に達すると、プログラムはエラーを報告し、プログラムは最初にエラーオブジェクトを作成し、次にこのエラーオブジェクトをスローします。プログラムはJava仮想マシン(JVM)で実行されており、プログラムによってスローされたエラーオブジェクトはJVMによってキャッチされます。もちろん、JVMはエラーオブジェクトをキャッチした後、何をすべきかわからないため、エラーを調整するのに役立ちません。JVMはエラーメッセージを出力します。

要約すると、次のとおりです。

  • 上記の例の例外は、ランタイム例外です(例外はエラーです)。
  • プログラムはエラーオブジェクトを作成し、エラーオブジェクトをスローします(例外をスローします)
  • デフォルトでは、JVMはエラーメッセージをキャプチャして出力します(キャッチ例外)。

JVMが直接例外を取得できないのはなぜですか

まず、次のコードを見てください

package com.yichang;

public class Test {
    public static void main(String[] args) {
        System.out.println(1/0);//0不能做除数

        System.out.println("你好");
    }
}

复制代码

実行結果は次のとおりです

上記のコードと実行結果から、コンソールにhelloが出力されていないことが簡単にわかります。これは、JVMによって例外がキャッチされた後にプログラムが終了するために発生します。つまり、JVMがエラーを処理すると、この時点でプログラムは終了するため、例外後のコードは実行できません。これは人生の例に基づいて考えることができます。Baiduがサービスを見つけられないためにサービスを停止する場合、それは確かにありません。したがって、後で行う必要があるのは、例外がJVMに到達する前に例外を停止し、自分で処理する方法です。トラブルJVMアップ。

異常分類

上記の例では、プログラムはエラーオブジェクトを作成することを述べましたが、objectsに関して言えば、オブジェクトはクラスによって作成され例外オブジェクト例外クラスによって作成される必要あることは誰でも知っています次の図は、Javaによって提供される例外クラスです。

図から、我々は見ることができ たThrowableの すべての例外、継承するすべての例外クラスのルートで のThrowable のように、 オブジェクト指向の すべてのクラスから継承する オブジェクト

例外の分類についてお話しましょう

  • RuntimeException:ランタイム例外。通常は手動で処理せず、何か問題が発生した場合に処理します。
  • その他の例外:手動で処理する必要があります。
  • エラー:通常、システムレベルのエラーを指します。

私は人生の例を使用して、これらの3つの異常を説明します。これは初心者には理解しやすいものです。山を運転しているとします。

  • 運転中、山にたくさんの小さな石を見つけましたが、すべての小さな石を処理することはできません。現時点ではまだ正常に運転しています。小さな石がタイヤに損傷を与えたときに、スペアタイヤを交換しましたそれは実行時例外
  • 運転中、目の前に大きな石が道路をふさいでいるのを発見したので、今度は車から降りて石を降ろさないと山を登れませんが、これは別の例外です。
  • 上り坂を走行中に山が崩れてしまい、処理できませんでした。山の準備ができるまで待たないと、続行できません。エラーです。このようなエラーは、通常のプログラマでは処理できません。

例外処理方法

トライして・・・キャッチ処理

構文

try{
    //尝试执行的代码
        }catch(Exception e){

    //处理异常的代码
        }finally{

    //最终的
        }
复制代码

以下では、記事のケースを変換します

package com.yichang;

public class Test {
    public static void main(String[] args) {
        try {
            System.out.println(1/0);//0不能做除数
        }catch (Exception e){
            e.printStackTrace();//打印错误信息,给程序员看的
            System.out.println("系统出现错误,请联系管理员");//给客户看的
        }finally {

            //一般做收尾工作
            System.out.println("你好");
        }

    }
}

复制代码

実行結果は次のとおりです

  • トライ -監視します。監視するコード(例外をスローする可能性のあるコード)をtry文ブロックに入れ、try文ブロックで例外が発生すると、例外がスローされます。
  • キャッチ -例外を捕捉するために使用されます。catchは、tryブロックで発生する例外をキャッチするために使用されます。
  • 最後に -finallyステートメントブロックが常に実行されます。主に、tryブロックで開かれた物理リソース(データベース接続、ネットワーク接続、ディスクファイルなど)を回復するために使用されます。

スローとスロー処理

  • throwsは、メソッドが例外をスローしようとしていることを示します
  • throwは、例外を外側にスローします

package com.yichang;

public class Test1 {

    public static void chu(int a,int b) throws Exception{
        if (b==0){
            throw new Exception("除数不能为0");
        }else {
            System.out.println(a/b);
        }
    }

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

        chu(1,0);
    }
}

复制代码

運用実績

上記のメソッドは両方とも例外を処理します。例外を処理できる場合は、try···catchメソッドを使用して例外をキャッチして処理します。例外を処理できない場合は、throwsメソッドを使用して例外をスローしますが、プログラマーとして常に1つの文を覚えておく必要があります。生成されたエラーは可能な限り自分で処理する必要があり、スローされる例外の数は少なくなります

カスタム例外

この時点で、何人かの友人は尋ねなければならないかもしれません、なぜあなたは例外をカスタマイズしたいのですか、Javaがそれほど多くを与えるだけでは不十分ですか?もちろん、それだけでは十分とは言えません。たとえば、人生では、大浴場の中に男性と女性の大浴場があることは誰でも知っています。 、これは大きな異常であると誰もが思うでしょうが、jdkは性別と浴場に関連する異常を提供しますか?絶対に不可能です。この時点で例外をカスタマイズする必要があります。銭湯を例にとり、参考までにプログラムを書いています。

カスタム例外:ExceptionまたはRuntimeExceptionを直接継承してカスタム例外を実装します

人のクラス

package com.yichang;

public class Person {
    String name;//姓名
    String gender;//性别

    public Person(String name, String gender) {
        this.name = name;
        this.gender = gender;
    }
}

复制代码

蔵王堂子クラス

package com.yichang;

public class ZaoTangZi {
    public void man(Person p) throws GenderException{
        if (p.gender=="男"){
            System.out.println("欢迎光临");
        }else {
            //需要抛出一个异常
            throw new GenderException("性别错误,这里是男澡堂子");
        }
    }
}

复制代码

GenderExceptionクラス

package com.yichang;

public class GenderException extends Exception{
    //自己定义的异常必须要继承Exception或RuntimeException

    public GenderException(String msg){
        super(msg);//调用父类的构造方法,Exception(msg)
    }
}

复制代码

テストクラス

package com.yichang;

public class Test {
    public static void main(String[] args) throws GenderException{
        Person p1 = new Person("张三","男");
        Person p2 = new Person("小花","女");

        ZaoTangZi z = new ZaoTangZi();
        z.man(p2);
    }
}

复制代码

演算結果:

まとめ

これを書けば、例外処理に関するこの記事は終了です。読んだ後、次の質問を理解する必要があります。

  • 異常なもの
  • 例外に対処する方法
  • 例外をカスタマイズする方法

少し冗長かもしれませんが、初心者にはやさしいので、ご容赦ください。

公開口座

私の記事を評価してもらえれば、パブリックアカウントに注意を払い、お互いを評価することができます。

おすすめ

転載: juejin.im/post/5e9d045fe51d45470c12c81e