JAVA異常Exception——異常構造図、throwキーワード、throwsキーワード、try…catch…finally異常取得


文書ディレクトリ
  • 一、Java異常階層図
  • 二、Java異常分類
  • 三、Java異常処理
  • 四、カスタム例外
  • 一、Java異常階層図
    Javaでは、すべての例外に共通の祖先Throwable(放出可能)があり、Throwable:Exception(例外)とError(エラー)の2つの重要なサブクラスがあります.
    二、Java異常分類
    以上の図のようにJava例外は、エラーErrorと例外Exceptionの2つに分類され、例外Exceptionはコンパイル時異常と実行時異常RunTimeExceptionに分けられます.
    1、エラーエラーErrorエラーは、プログラムが処理できないエラーであり、アプリケーションの実行中に深刻な問題があることを示します.
    ほとんどのエラーは、コード作成者が実行する操作に関係なく、コード実行時にJVM(Java仮想マシン)に発生する問題を示します.プログラムのバグに由来する可能性がありますが、メモリの消費などの環境問題に由来する可能性があります.
    エラーはプログラムで処理する必要はなく、実行環境処理があります.
    一般的な例外:
    (1)OutOfMemoeyErroe:Java heap spaceスタックメモリオーバーフローは一般的にシステムエラーによく見られ、解決できず、コードを修正するしかない.
    (2)StackOverLowErrorスタックメモリオーバーフロー.
    2、異常Exception異常Exceptionはプログラム自体で処理できる異常です.Exceptionクラスには重要なサブクラスRuntimeExceptionがあり、RuntimeExceptionクラスとそのサブクラスは「JVM共通操作」によるエラーを表します.
    (1)ランタイム異常ランタイム異常はすべてRuntimeExceptionクラスとそのサブクラス異常であり、これらの異常は一般的にプログラム論理エラーによるものである.これはプログラムにバグがあることを意味し、配列が境界を越えて0が除かれ、パラメータが規範を満たしていないことを意味する...このような異常はプログラムを変更して避ける必要があり、Javaコンパイラは強制的にこのような異常を処理することを要求する.プログラムは論理的な観点からこのような異常の発生をできるだけ避けるべきである.
    実行時の例外の特徴は、Javaコンパイラがチェックしないことです.つまり、プログラムにこのような例外が発生する可能性がある場合、try-catch文でキャプチャされていなくても、throws句で宣言されずに投げ出されてもコンパイルされます.
    (2)コンパイル時異常コンパイル時異常(Java.lang.Exception)は、RuntimeException以外の異常であり、タイプ的にはいずれもExceptionクラスおよびそのサブクラスに属する.一般にプログラムが正しいためであるが,外在的な環境条件が満たされていないために生じる.
    たとえば、ユーザーエラーやI/Oの問題など、プログラムは存在しないリモートソケットポートを開こうとします.これはプログラム自体の論理エラーではなく、リモートマシン名エラー(ユーザスペルエラー)の可能性が高い.商用ソフトウェアシステムでは,プログラム開発者はこの問題を考慮して処理しなければならない.
    Javaコンパイラは、このような例外の処理を強制します.このような例外をキャプチャしないと、プログラムはコンパイルできません.
    (3)コンパイル時異常と実行時異常の連絡Java.lang.ExceptionとJava.lang.ErrorはJava.lang.Throwableから継承される.Java.lang.RuntimeExceptionはJava.lang.Exceptionから継承されます.
    三、Java異常処理
    1、異常(throw、throws)を投げ出して呼び出し者に異常を投げ出し、呼び出し者に処理させる.メソッドにエラーが発生して例外が発生した場合、メソッドは例外オブジェクトを作成し、実行時システムに渡します.例外オブジェクトには、例外タイプや例外が発生した場合のプログラムステータスなどの異常情報が含まれています.ランタイムシステムは、異常を処理するコードを探して実行します.(1)throw 1 throwはメソッドの内部に用いられ,Javaコードはいずれも例外を投げ出すことができ,throw文は例外を投げ出す.throwの後ろに異常クラスオブジェクトがあります.②使用形式:
    throw  new     (“    ”); 
      :
    throw new NullPointerException("     ");
    

    throwは常に関数体に現れ、Throwableタイプの例外を投げ出すために使用され、プログラムはthrow文の後にすぐに終了し、その後の文は実行できません.③ throwDemo1
    public class throwDemo1{
    	public static void main(String[] args) {
    		int[] arr = null; //       ,   null
    		int j = getArr(arr, 3);
    		System.out.println(j);
    	}
    	//  int[]  ,             +1
    	public static int getArr(int[] arr,int index) {
    		if( arr == null ) {
    			throw new NullPointerException("     ");
    		}else if ( arr.length < index ) {
    			throw new ArrayIndexOutOfBoundsException("      ");
    		}
    		int i = arr[index];
    		return i + 1;
    	}
    }
    

    int[] arr = null;文では配列をnullと定義し、getAr()メソッドではif判定構造が配列arrをnullと検出し、対応するコードブロック:throw new NullPointerException(「空指向異常」)を実行する.異常NullPointerExceptionを放出し、出力結果に「空指向異常」を表示するので、出力結果は:
    Exception in thread "main" java.lang.NullPointerException:      
    	at com.woniuxy.onclass0401.Test1.getArr(Test1.java:11)
    	at com.woniuxy.onclass0401.Test1.main(Test1.java:5)
    

    ④ throwDemo2
    public class throwDemo2{
    	    public static void main(String[] args) {
    		int[] arr = {}; //       
    		int j = getArr(arr, 3);
    		System.out.println(j);
    	}
    	//  int[]  ,             +1
    	public static int getArr(int[] arr,int index) {
    		if( arr == null ) {
    			throw new NullPointerException("     ");
    		}else if ( arr.length < index ) {
    			throw new ArrayIndexOutOfBoundsException("      ");
    		}
    		int i = arr[index];
    		return i + 1;
    	}
    }
    

    コードはDemo 1と同じで、文int[]arr={}だけです.で、配列は{}と定義されているので、getAr()メソッドではif判定構造が配列arrを{}として検出し、対応するコードブロック:throw new ArrayIndexOutOfBoundsException(「下付き境界異常」)を実行する.異常ArrayIndexOutOfBoundsExceptionを放出し、出力結果に「下限異常」を表示しますので、出力結果は次のようになります.
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:       
    	at com.woniuxy.onclass0401.Test1.getArr(Test1.java:13)
    	at com.woniuxy.onclass0401.Test1.main(Test1.java:5)
    

    ここで注意しなければならないのは、throw new Null PointerException(「空指向異常」)のような文throwが異常を投げ出す文である.とthrow new ArrayIndexOutOfBoundsException(「下限異常」)と;newの後に続く異常タイプは自分で勝手に設定することができ、これはAPIの中にあるものでもカスタムのものでもよく、括弧の中の内容も自分で定義することができます.
    (2)throws 1メソッドに異常が発生する可能性があるが、この異常を処理する能力がない場合は、メソッド宣言でthrows句で放出異常を宣言することができる.メソッド名の後のthrows Exception 1,Exception 2,...,ExceptionNは放出する例外を宣言するリストであり,複数の例外はカンマで分割される.②使用形式:
       ()  throws     ;
      :
    public static void main(String[] args) throws Exception {
    
    }
    

    ③ throwsDemo
    public class throwsDemo{
    	//      ,     0    ,    
    	public static void main(String[] args) throws Exception {
    		System.out.println("  x  :");
    		Scanner sc = new Scanner(System.in);
    		double x = sc.nextDouble();
    		double s1 = area(x);
    		System.out.println(s1);
    	}
    	public static double area(double x) throws Exception {
    		if (x == 0) {
    			throw new Exception("x     0");
    		} else if ( x < 0 ) {
    			throw new Exception("x     0  ");
    		}
    		double s = 3.14 * x * x;
    		return s;
    	}
    }
    

    throws文は、メソッド定義時にメソッドが投げ出す例外タイプを宣言し、Exception例外タイプが投げ出された場合、メソッドはすべての例外を投げ出すと宣言します.
    メソッドが例外リストの例外を投げ出すと、メソッドはこれらのタイプとそのサブクラスタイプの例外を処理せず、メソッドを呼び出すメソッドに投げ出され、彼が処理します.④throwsの後ろに異常クラスがついています.ルールは以下のとおりです:<1>エラー、RuntimeException、またはそれらのサブクラスである場合、throwsキーを使用して投げ出す例外を宣言することなく、コンパイルはスムーズに通過しますが、実行時にシステムに投げ出されます.<2>メソッドが放出できる任意の検出可能な例外(checked exception)を宣言する必要があります.すなわち、1つの方法で検出可能な例外が発生する可能性がある場合、try-catch文で取得するか、throws句で宣言して投げ出すか、コンパイルエラーが発生します.<3>例外が投げ出された場合にのみ、このメソッドの呼び出し元は例外を処理または再投げ出さなければならない.メソッドの呼び出し元がこの異常を処理できない場合は、放出を続けるべきである.<4>呼び出しメソッドは、検出可能な例外の処理および宣言ルールに従う必要があります.メソッドを上書きすると、上書きメソッドとは異なる例外は宣言できません.宣言された例外は、上書きメソッドによって宣言された例外のクラスまたはサブクラスである必要があります.
    2、スナップ異常(try...catch...finally)1、概念スナップ異常は異常が発生した場所で直接処理され、try-catch文またはtry-catch-finally文で実現される.
    2、処理形式:(1)個別異常の場合
    try {
                 (     );
    } catch (        ) {
                   ;  
    } finally {      
               (     );
    }
    

    (2)複数の例外の場合複数の例外が発生した場合、2つの例外の間に継承関係がある場合は、親を後ろに置く必要があります.
    try {
                 (     );
    } catch (        ) {
                   ;  
    }  catch (        ) {
                   ;  
    }...... 
    
    finally {      
               (     );
    }
    

    (3)その他の形式
    try {
                 (     );
    } finally {      
               (     );
    }
    

    (4)実行順序1 tryが異常をキャプチャしていない場合:try文ブロック内の文が1つずつ実行され、プログラムはcatch文ブロックをスキップし、finally文ブロックとその後の文を実行する.②tryが異常をキャプチャし、catch文ブロックにこの異常が処理されない場合:この異常はJVM処理に投げ出され、finally文ブロック内の文は実行されるが、finally文ブロック後の文は実行されない.③tryが異常をキャプチャすると、catch文ブロックにこの異常を処理する場合がある.try文ブロックでは順番に実行され、ある文に異常が発生すると、プログラムはcatch文ブロックにジャンプし、catch文ブロックと1つずつ一致し、それに対応する処理プログラムを見つけ、他のcatch文ブロックは実行されないが、try文ブロックでは、異常が発生しても文は実行されず、catch文ブロックが実行された後、finally文ブロック内の文を実行し、最後にfinally文ブロック後の文を実行します.④finallyの役割:主に接続を切断したり、ストリームをオフにしたりするために使用されます.(5)異常Demoの捕捉
    public class Demo{
    	//     :try...catch...finally
    	public static void main(String[] args) throws Exception  {
    		//       
    		try {
    			double avg = area( 1,2,3,4,5,6 );		//          (      )
    			System.out.println( "   =" + avg );
    		} catch (Exception e) {
    			System.out.println(e);		//           
    			System.out.println( "     " );
    		} finally {	//       (      )
    			System.out.println( "       " );
    		}
    		System.out.println( "    " );
    	}
    	public static double area(double...arr) throws Exception  {
    		double  sum = 0;
    		for( double a : arr ) {
    			if ( a < 0 ) {
    				throw new Exception("x     0  ");
    			} 
    			sum = sum + a;
    		}
    		return  sum / arr.length;
    	}
    }
    

    四、カスタム例外
    (1)ユーザは例外クラスをカスタマイズし,Exceptionクラスを継承するだけでよい.(2)カスタム手順:①カスタム例外クラスを作成する.②メソッドでthrowキーワードで例外オブジェクトを投げ出す.③現在異常を放出する方法で異常を処理する場合、try-catch文を用いて取得して処理することができる.そうでなければ、メソッドの宣言でthrowsキーワードを使用して、メソッド呼び出し元に投げ出す例外を指定し、次の操作を続行します.④異常メソッドが発生した呼び出し元で異常をキャプチャして処理する.(3)カスタム例外Demo:①まず、属性名、年齢、スコアを持つStudioクラスを作成します.Studentのコンストラクション関数で入力された年齢とスコアを判断し、条件に応じて異常を投げ出すと、人間の年齢が0未満になることは不可能であり、一般的に200以上になることは不可能であり、スコアも0未満になることはできないことを知っているので、ここで2つの異常NotAgeExceptionとIgnoralScoreExceptionをカスタマイズします.
    //    Student ,      、  、   。
    public class Student {
    	String name;
    	int age;
    	double score;
    
    	//      
    	public Student() {
    		super();
    	}
    	//      
    	public Student(String name, int age, double score) throws NotAgeException, IgnoralScoreException {
        //    ,      
    		if ( age <= 0 || age > 200 ) {
    			throw new NotAgeException("     ");
    		}else if ( score < 0 ) {
    			throw new IgnoralScoreException("    ");
    		}
    		this.name = name;
    		this.age = age;
    		this.score = score;
    	}
    }
    

    ②NotAgeExceptionとIgnoralScoreExceptionは私たち自身が定義した例外であり、APIにはないので、この2つの例外クラスを新規作成してExceptionを継承する必要があります.
    //NotAgeException  
    public class NotAgeException extends  Exception{
    	public NotAgeException() {}
    	public NotAgeException(String message) {
    		super(message);
    	}
    }
    
    //IgnoralScoreException  
    public class IgnoralScoreException extends Exception{
    	public IgnoralScoreException( ) { }
    	public IgnoralScoreException(String s) {
    		super(s);
    	}
    }
    

    ③最後にmain関数を作成し、パラメータ伝達と呼び出しにより機能を実現する.主関数に取り込まれた年齢とスコアがStudentクラスの判定条件を満たすと,対応する異常が投げ出される.
    //main    
    public class Demo{
    	public static void main(String[] args) throws NotAgeException, IgnoralScoreException {
    		Student s = new Student("  ",18,30);
    		System.out.println("name = " + s.name + "  age = " + s.age + "  score = " + s.score );
    	}
    }