1。Java例外概要:
例外とは、プログラムが実行されているときに異常な操作を意味します
1。例外の起源:
Javaクラスの形を介した本物の問題の説明とオブジェクトに封印された
実際、Javaが異常な状況を説明した後のオブジェクトの症状です。
2。問題には2つのタイプがあります。1つは深刻な問題であり、もう1つは深刻な問題です
深刻なケースの場合、Javaはエラークラスを通じてそれを説明します
通常、エラーはそれを処理するために書き込まれません。
非精力的な場合、Javaは例外クラスで説明されています
例外のために、ターゲット処理方法を使用してそれを処理できます
3.一般的な例外は次のとおりです。配列コーナーマーカーのクロスボーダーの例外、ヌルポインターの例外...
4.エラーまたは例外がいくつかの共通コンテンツがあるかどうか。
例:異常なニュース、原因など
スロー可能//プレミアムクラス(同じ共通性から次の2つのクラスが抽出されます)
| -Error
| -excption // 2つのサブクラス(定義された多くの問題があります(例外が発生します)) /*親クラス名はサブクラスの接尾辞名* /
例1:例外の発生の例
class demo {public int div(int x、int y){return x/y; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); int x = d.div(4,0); // 0 as divisor system.out.println( "x ="+x); system.out.println( "over"); }}実行結果:
スレッド「Main」Java.lang.ArithMeticexception: / zeroによる例外
demo.div(例外demo.java:5)
exceptiondemo.main(exceptiondemo.java:15)
上記の結果から、5行目と15行目の両方で例外が発生したことを分析できます。これは、分割メカニズム、除数が0になることができず、操作が実行されるときに例外がスローされるためです。
例2:例外例2、メモリオーバーフロー
class demo {public int div(int x、int y){return x/y; }} 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( "over"); */ byte [] arr = new byte [1024*1024*1000]; }}実行結果:
スレッド「Main」Java.lang.outofMemoryError:Java Heap Spaceの例外
exceptiondemo.main(exceptiondemo.java:19)
java.lang.outofmemoryerror:メモリオーバーフローの例外を表します
2。例外処理:
例外処理のために、Javaは処理のためのユニークなステートメントを提供します
形式
試す
{
検出する必要があるコード。
}
キャッチ
{
例外を処理するためのコード。 (処理方法)
}
ついに
{
間違いなく実行されるコード。 (処理方法)
}
例1:キャッチステートメントを試してみてください
class demo {public int div(int x、int y){return x/y; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); try {int x = d.div(4,0); System.out.println( "x ="+x); } catch(Exception E){System.out.println( "離婚除数"); } system.out.println( "over"); /*byte [] arr = new byte [1024*1024*1000];*/}}実行結果:
除数にエラーがあります
以上
結果分析:プログラムが実行されているとき、分割ステートメントが実行されるとき:x/yを返すと、例外オブジェクトが生成されます。新しいArchMeticexception()、TRYステートメントは、CATCHステートメントのパラメーターを使用してこのオブジェクトをキャプチャします。
例外e = new ArchMeticexception();
catch処理ステートメントを実行した後、問題は処理され、最終ステートメントが終了し、出力は終了しました
例2:キャプチャされた例外オブジェクトで一般的なメソッド操作を実行する(親クラスが投げられる方法)
string getMessage(); //例外情報を取得します
toString()//例外名:例外情報
printStackTrace()//出力例外名、例外情報、例外が発生する場所
class demo {public int div(int x、int y){return x/y; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); try {int x = d.div(4,0); System.out.println( "x ="+x); } catch(Exception E){System.out.println( "離婚除数"); //例外情報System.out.println(e.getMessage()); //例外情報、例外名System.out.println(e.toString()); //例外名、例外情報、例外が発生する場所e.printstacktrace(); } system.out.println( "over"); /*byte [] arr = new byte [1024*1024*1000];*/}}実行結果:
除数にエラーがあります
/ゼロによる
java.lang.arithmeticexception: / by zero
java.lang.arithmeticexception: / by zero
demo.div(例外demo.java:5)
exceptiondemo.main(exceptiondemo.java:17)
以上
実行結果の分析から、JVMのデフォルトの例外処理メカニズムは、実際にPrintStackTraceメソッドを呼び出しています。
例3:例外スローを処理する2つの方法
1。処理のためにJVM仮想マシンに投げます
2。スローされた例外を自分で処理します
class demo {public int div(int x、int y)スロー例外/*例外が発生する可能性のある場所*/{return x/y; }} 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( "over"); }}実行結果:
ExceptionDemo.java:15:エラー:報告されていない例外エラー例外。投げるために捕獲または宣言する必要があります
int x = d.div(4,0);
^
1エラー
結果分析:これは、例外が処理されないためです
処理方法1:例外を継続的にスローし、JVM仮想マシン自体を処理させます
class demo {public int div(int x、int y)スロー例外/*例外が発生する可能性のある場所*/{return x/y; }} 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( "over"); }}処理方法2:自分で例外を処理します
class demo {public int div(int x、int y)スロー例外/*例外が発生する可能性のある場所*/{return x/y; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); //例外を自分で処理する{int x = d.div(4,0); System.out.println( "x ="+x); } catch(Exception E){System.out.println( "離婚除数"); //例外情報、例外名System.out.println(e.toString()); system.out.println( "over"); }}}要約:
関数の例外を宣言します。セキュリティを改善し、コンパイル障害を処理せずにコールソースを処理できるようにするのが便利です。
例4:複数の例外の処理
1.例外を宣言する場合は、より具体的に処理できるように、より具体的な例外を宣言することをお勧めします。
2。いくつかの例外を宣言すると、いくつかのキャッチブロックがあります。不必要なキャッチを速く定義しないでください。
複数のキャッチブロックに継承関係がある場合、親クラスの例外キャッチブロックを以下に配置します。
class demo {public int div(int x、int y)throws arithmeticexception、arrayindexOutofboundsexception {int arr [] = new int [x]; System.out.println(arr [4]); x/yを返します; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); try {int x = d.div(4,0); System.out.println( "x ="+x); } catch(arithmeticexception e) / *例外オブジェクトの分割は受信されます、最初の実行は * / {system.out.println( "離婚除数"); //例外情報、例外名System.out.println(e.toString()); system.out.println( "over"); } catch(arrayindexOutofboundsexception e) / *範囲外のデータを使用してオブジェクトを受信します。2番目の実行は * / {system.out.println( "arrayout"); //出力例外情報System.out.println(e.toString()); } catch(例外e) /*親クラスの例外を受信し、最後に実行します。これを書かないことをお勧めします。プログラムに終了します*//*多型*/ {system.out.println(e.toString()); }}}実行結果:
配列は範囲外です
Java.lang.ArrayIndexOutofboundsexception:4
提案:
CACTを処理するときは、CACTで特定の処理方法を定義する必要があります。
e.printstacktrace()を単に定義しないでください。
出力ステートメントを書くだけではありません
ユーザーはそれを理解できないため、ファイルに保存して開発者に送信して定期的に表示するのが最善です。
例5:カスタム例外
私たちが使用している例外がすべてJavaにカプセル化されていることに気づきましたか
ただし、実際の開発では、プログラムに表示される例外は、Javaがカプセル化されていないことです。
現時点では、自分で定義する必要があります
上記のコードによると、私は除数が負の数ではないことを定義します。コードは次のとおりです
class demo {public int div(int x、int y)throws fushuexception/*Top anepceation*/{if(y <0){throw new fushuexception( "ネガティブ数------/bu fushu"、y); /*例外を手動でスローするオブジェクト*/} x/yを返します。 }} class fushuexceptionは例外を拡張します{private int value; fushuexception(string m、int value){super(m); /*親クラスの例外のgetMessageメソッドにパラメーターを渡す*/ this.value = value; } public int getValue() /*カスタマイズされたメソッド、ネガティブ数を返します* / {return値; }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); try {int x = d.div(4、-3); System.out.println( "x ="+x); } catch(fushuexception e) /*例外オブジェクトをキャッチ* / {system.out.println(e.getMessage()+e.getValue()); } system.out.println( "over"); }}実行結果:
分母に負の数が現れます-----/bu fushu-3
以上
上記の結果から、私たちは見ることができます
このプログラムでは、除数は-3であり、これも間違っていると見なされ、実行できません。
次に、この問題のカスタム説明が必要です。
関数内に例外オブジェクトをスローする場合、対応する処理アクションを指定する必要があります。
または内部で処理します。
発信者がそれを処理する機能について宣言します。
一般的に言えば、例外は関数に表示され、関数で宣言する必要があります。
印刷された結果には例外名のみがあることがわかりましたが、例外情報はありませんでした。
カスタム例外は情報を定義していないためです。
例外情報を定義する方法は?
例外情報の操作が親クラスで完了したためです。
したがって、サブクラスは、スーパーステートメントを介して構築するときに、例外情報を親クラスに渡すだけです。
次に、GetMessageメソッドを使用してカスタム例外情報を直接取得できます。
カスタム例外は、カスタムクラスの継承例外である必要があります。
継承例外理由:
例外システムには機能があります。例外クラスと例外オブジェクトの両方がスローされているためです。
それらはすべて投げられる可能性があります。この投げ性は、投げ可能なシステムのユニークな機能です。
このシステムのクラスとオブジェクトのみが、スローとスローによって操作できます。
スローとスローの違い
スローは関数で使用されます。
スローは関数内で使用されます。
例外クラスとそれに続くスロー。その後、複数の後に続くことができます。コンマで区切られています。
スローの後に例外オブジェクトが続きます。
例6:例外に特別なサブクラスの例外がありますruntimeexception
例外が関数コンテンツにスローされている場合、宣言なしに関数を宣言することができ、コンパイルは渡されます。
例外が関数で宣言された場合、発信者はそれを処理することができず、コンピレーションは介して行われます
関数を宣言する必要がない理由は、発信者がそれを処理する必要がないためです。
この例外が発生した場合、実行中に実行できないため、プログラムが停止することを願っています。プログラムが停止した後、プログラムが停止することを願っています。
プログラマーはコードを変更しました。
class demo {public int div(int x、int y)throws fushuexception/*スローまたはスローしなかった結果は同じ*/{if(y <0){show new fushuexception( "ネガティブな数値-----/bu fushu"、y); } x/yを返します。 }} class fushuexceptionはruntimeexception /*継承runtimeexception* /{fushuexception(string m、int value){super(m); }} class ExceptionDemo {public static void main(string args []){demo d = new demo(); int x = d.div(4、-3); /*これを実行した後に例外が表示されます。コンピレーションに問題はありません*/ system.out.println( "x ="+x); system.out.println( "over"); }}実行結果:
スレッド「Main」Fushuexceptionの例外:分母に負の数が表示されます------/bu fushu
demo.div(例外demo.java:7)
exceptiondemo.main(例外demo.java:26)
上記の結果から、次のようになります。
カスタム例外の場合:例外が発生した場合、操作を継続できません。
カスタム例外がRuntimeExceptionを継承します。
例外のために、2つのタイプがあります。
1。コンピレーション中に検出された例外。
2。コンピレーション中に検出されない例外(ランタイム例外。RuntimeExceptionとそのサブクラス)
上記の記事は、Javaの例外処理メカニズムが私があなたと共有したすべてのコンテンツであることを包括的に理解しています。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。