JAva学習の異常(二)

5614 ワード

例外のカテゴリ
スーパークラスThrowable:すべての例外はThrowableクラスによって継承され、
  • Errorクラス:javaランタイムシステムの内部エラーとリソース消費エラーを記述する
  • Exceptionクラス:
  • RunTimeExceptionクラス:プログラムエラーによる異常
  • その他の異常:プログラム自体は問題ないが、I/Oエラーなどの問題による異常が発生した

  • 通常、プログラムにRunTimeException異常が発生した場合は、エラーが発生したタイプ変換、配列アクセスの限界、空のポインタへのアクセスなど、あなたの問題に違いありません.
    例外の宣言
    メソッドは、クラスのコンストラクタ宣言など、放出される可能性のある例外を最初に宣言する必要があります.
    class Demo
    {
        public FileInputStream(String s)throws FileNotFoundException
    }

    問題が発生した場合、コンストラクタは新しいFileInputStreamオブジェクトを初期化するのではなく、FileNotFoundExceptionクラスオブジェクトを放出し、システムは例外プロセッサの検索処理を開始します.
    どのような場合に例外を投げ出すべきか:
  • は、例えば、FileInputStreamコンストラクタ
  • のような検査された例外を放出する方法を呼び出す.
  • プログラムの実行中にエラーが検出され、throw文を使用してチェック済みの例外
  • が投げ出されました.
  • プログラム自体にエラーが発生しました.例えば、a[-1]=0はArrayIndexOutOfBoundsExceptionの未検査の異常
  • を放出します.
  • java仮想マシンとランタイムライブラリで発生した内部エラー
  • 前の2つの状況が発生した場合、その方法を呼び出したプログラマーに異常を投げ出す可能性があることを伝えなければならない.1つの方法で複数の例外が投げ出される可能性がある場合は、すべての例外クラスをリストし、javaの内部エラー(Errorから継承されたクラス)に対して宣言する必要はありません.なぜなら、私たちはそれらを制御する能力がないからです.
    class ImageDemo
    {
        ...
        public Image loadImage(String s)throws FileNotFoundException,EOFException
        {
            ...
        }
    }

    注:C++では、throwの説明がない場合、関数は例外を放出する可能性がありますが、javaではthrows宣言子がない方法では、チェックされた例外を放出できません.
    例外の放出方法
    既存の例外クラスの場合、通常の方法:1.適切な例外クラスが見つかりました2.このクラスのオブジェクトを作成します3.オブジェクトを投げ出します
    メソッドが例外を投げ出すと、メソッドは呼び出し元に戻ることはできません.
    String readData(Scanner in)throws EOFException
    {
        ...
        while(...)
        {
            if(!in.hasNext())// EOF encounterd
            {
                if(n < len)
                {
                    String gs = "Content-length:" + len + ",Received:" + n;
                    throw new EOFException(s);
                }
            }
            ...
        }
        return s;
    }

    注意:throwsとthrowの違い
  • throwsは関数(括弧と括弧の間)に使用され、throwは関数内に使用されます.
  • throwsの後ろには異常クラスが接続されており、複数あってもよく、throwの後ろには異常オブジェクトが接続されている.

  • カスタム例外クラス
    ある特殊なシーンでは、需要に応じて現在の要求に合致する異常クラスを人為的に設計し、問題の解釈を助ける必要がある場合がある.この場合、IOExceptionに継承されたクラスを定義するなど、Exceptionクラスまたはそのサブクラスに継承されたクラスを定義する必要があります.
    プログラムに異常が発生し、演算を続行できない場合は、RunTimeExceptionクラスにカスタム例外を継承できます.
    class FileFormatException extends IOException
    {//    ,                                  
        public FileFormatException()//               
        {
            super();
        }
        public FileFormatException(String s)//          
        {
            super(s);
            //                 ,      ,        super      ,      getMessage             
        }
    }
    
    String readData(BufferReader in)throws FileFormatException
    {
        ...
        while(...)
        {
            if(ch == -1)// EOF encounterd
            {
                if(n < len)
                    throw new FileFormatException(...);
            }
            ...
        }
        return gs;
    }

    特殊なサブクラス異常
    Exceptionクラスでは、関数に宣言されていない場合、関数内に例外が投げ出された場合にコンパイルに失敗します.ただし、Exceptionには特殊なサブクラス異常RunTimeException(ランタイム異常)があります.
    関数内にRunTimeException異常またはそのサブクラス異常が投げ出された場合、関数上で宣言せずにコンパイルすることもできます.関数にRunTimeException例外またはそのサブクラス異常が宣言されている場合、呼び出し元は処理せずにコンパイルできます.
    なぜなら、呼び出し元にこの異常を処理させる必要がないため、異常が発生すると仮想マシンはプログラムを停止させ、実行時に演算を継続できない場合があるため、仮想マシンはプログラムを停止させた後、プログラマーはコードを修正することができる.
    class Demo
    {
        int div(int a, int b)throws ArithmeticException// ①
        {
            return a/b;
        }
        /*int div(int a, int b)// ②
        {
            if(b==0)
                throw new ArithmeticException("   ");
            return a/b;
        }*/
        /*int div(int a, int b)// ③
        {
            if(b==0)
                throw new Exception("   ");
            return a/b;
        }*/
    }
    
    class ExceptionDemo
    {
        public static void main(String[] args)
        {
            Demo d = new Demo();
    
            int x = d.div(4,0);
            System.out.println("x=" + x);
    
            System.out.println("END!");
        }
    }
    /*
          ① ②           ,③,     。
    */