1。例外とは何ですか?
まず、下の図の例を見てみましょう。
この例では、エラーコードは0で割ることによって存在します。
helloexception.java
パッケージcom.yiibai.tutorial.exception; public class helloexception {public static void main(string [] args){system.out.println( "3"); //この部門は問題ありません。 int値= 10/2; System.out.println( "2"); //この部門は問題ありません。値= 10/1; system.out.println( "one"); //この部門には問題があり、0で割っています。/ここでエラーが発生しました。値= 10/0; //次のコードは実行されません。 System.out.println( "Let's Go!"); }}この例を実行すると、
コンソール画面に通知が表示されます。コードの行に関する情報を含む、エラー通知は非常に明確です。
以下の図のプロセスを通じて、次のプログラムを見てみましょう。
上記の具体化のコードを変更します。
hellocatchexception.java
パッケージcom.yiibai.tutorial.exception; public class hellocatchexception {public static void main(string [] args){system.out.println( "3"); //この部門は問題ありません。 int値= 10/2; System.out.println( "2"); //この部門は問題ありません。値= 10/1; system.out.println( "one"); try {//この部門には問題があり、0で割っています。/ここでエラーが発生しました。値= 10/0; //次のコードは実行されません。 System.out.println( "value =" + value); } catch(arithmeticexception e){// catch blockのコードはsystem.out.println( "error:" + e.getmessage())を実行されます。 //キャッチブロック内のコードはsystem.out.println( "Ingrore ...")を実行されます; } //このコードはsystem.out.println( "let's go!"); }}サンプルの結果の実行:
三つ
二
1つ
エラー: /ゼロ
無視する...
さあ行こう!
次の手順を、例の画像の流れについて説明します。
2。例外階層<br />これは、Java例外の階層グラフのモデルです。
最高のクラスは次のとおりです
2つの直接サブクラスはエラーと例外です。
Javaでチェックされていないコンパイル時間の例外を含む、例外転送にはruntimeexceptionサブクラスがあります。実装の例の次のセクションで説明されているように、コンパイル時にチェックをチェックしてキャンセルします。
注:クラスは、エラーまたは例外の2つのブランチから継承する必要があります。
仮想マシンは、動的リンクが故障したとき、または仮想マシンの他の「ハード」障害が発生したときにこのエラーを上げます。典型的なJavaプログラムではエラーが発生しないため、Javaプログラムにはエラーが発生しません。ほとんどのプログラムは、例外クラスから派生したオブジェクトを投げてキャプチャします。例外は問題を示していますが、これらの問題は深刻な体系的な問題ではありません。あなたが書くほとんどのプログラムは、例外を投げてキャッチします。
例外クラスは、Javaパッケージの多くのサブクラスを定義します。これらのサブクラスは、異なるタイプの例外が発生する可能性があることを示しています。たとえば、negativearraysizeexceptionは、プログラムが負のサイズの配列を作成しようとしていることを示しています。
Java言語におけるディレクターのサブクラスの特別な意味:RuntimeExceptionクラスは、Java仮想マシンで(実行時に)発生する例外を表します。ランタイム例外の例は、nullyiibaierexceptionの例外です。これは、メソッドがnull参照を介してオブジェクトのメンバーにアクセスしようとすると発生します。 nullyiibaierexceptionは、プログラムがオブジェクトの抑制を試みる場所に表示される可能性があります。例外キャッチをチェックすることの利点は、しばしばそのコストを上回ります。
ランタイムの例外は遍在するため、常にキャッチまたは指定しようとすることは無駄です(読み取れないコードで維持不可能なコード)。コンパイラは、ランタイムの例外を猛攻撃して指定することを許可します。
Javaパッケージは、いくつかのRuntimeExceptionクラスを定義します。他の人と同じように、これらの例外をキャッチできます。しかし、ランタイム例外をスローすることを指定する方法は必要ありません。さらに、独自のRuntimeExceptionサブクラスを作成できます。ランタイムの例外 - 以下の議論には、ランタイムの例外をいつ、どのように使用するかについての詳細な説明が含まれています。 3.トライキャッチを使用して例外を処理します
例外から継承されたクラスを書き込みます。
ageException.java
パッケージcom.yiibai.tutorial.exception.basic; public class ageexception extends Exception {public ageException(string message){super(message); }} tooyoungexception.javapackage com.yiibai.tutorial.exception.basic; public class tooyoungexceptionはagexception {public tooyoungexception(string message){super(message); }} Tooldexception.java
パッケージcom.yiibai.tutorial.exception.basic; public class tooldexceptionはageexceptionを拡張します{public oldexception(string message){super(message); }} Ageutilsクラスの年齢をチェックする静的な方法。
ageutils.java
パッケージcom.yiibai.tutorial.exception.basic; public class ageutils {//この方法は年齢をチェックします。 //年齢が18歳未満の場合、メソッドは例外をスローするTooyoungexception // 40を超える年齢の場合、メソッドは例外をスローしますが、メソッドはパブリック静的ボイドチェック(int age)tooyoungexceptionをスローします。新しいtooyoungexception( "age" + age + "Too Young")を投げる; } elseの場合(年齢> 40){// 40歳以上の年齢の場合、例外がスローされます。 //この方法はここで終了します。新しいTooldException( "age" + age + "Toogh")を投げる); } //年齢が18-40の場合。 //このコードは実行されます。 system.out.println( "age" + age + "ok!"); }}例外と未確認の例外を確認してください。
AgeExceptionは例外であり、ToololdExceptionとTooyoungexception2のサブクラスはAgeExceptionの直接的なサブクラスであるため、「チェックされた例外」です。
ageutils.checkage(int)メソッドは例外をスローしており、キーワード「スロー」を介してメソッド宣言をリストする必要があります。または、より多くのレベルを投げることを宣言することもできます。
ageutils.checkage(int)の場所も、例外をキャッチするか、それを投げ続けるために処理する必要があります。
「チェックされた例外」は、「Javaコンパイラ」によってチェックされます。
2つのオプションがあります。
trycatchdemo1.java
パッケージcom.yiibai.tutorial.exception.basic; public class trycatchdemo1 {public static void main(string [] args){system.out.println( "recruiting ..."); //年齢システムを確認してください。 int age = 50; {ageutils.checkage(age); system.out.println( "you pass!"); } catch(tooyoungexception e){//ここで何かをする.. system.out.println( "あなたは若すぎて、合格しない!"); System.out.println(e.getMessage()); } catch(toolodexception e){//ここで何かをします..system.out.println( "あなたは年をとっています、合格しません!"); System.out.println(e.getMessage()); }}}次の例では、親クラスを通じて例外(Hyperexceptionクラス)をキャッチします。
trycatchdemo2.java
パッケージcom.yiibai.tutorial.exception.basic; public class trycatchdemo2 {public static void main(string [] args){system.out.println( "recruiting ..."); //年齢システムを確認してください。 int age = 15; try {//ここでは、TooldExceptionまたはtooyoungexception ageutils.checkage(age)を投げることができます。 system.out.println( "you pass!"); } catch(ageException e){//例外が発生した場合、ageExceptionのタイプ//このキャッチブロックはsystem.out.println( "your age novalid、you not coss"); System.out.println(e.getMessage()); }}}さまざまな例外を、論理プログラムと同じ方法で処理された場合、ブロックにグループ化することもできます。
trycatchdemo3.java
パッケージcom.yiibai.tutorial.exception.basic; public class trycatchdemo3 {public static void main(string [] args){system.out.println( "recruiting ..."); //年齢システムを確認してください。 int age = 15; try {//ここでは、TooldExceptionまたはtooyoungexception ageutils.checkage(age)を投げることができます。 system.out.println( "you pass!"); } catch(tooyoungexception | toololdexception e){// 1つのブロックでマルチ例外をキャッチします。 System.out.println( "年齢が無効で、合格しない"); System.out.println(e.getMessage()); }}} 4。財政的に試してください
トライキャッチブロックを介してエラーをキャッチすることに慣れています。例外を完全に処理するために、finallyで試してみてください。
try {//ここで何かをする} catch(exception1 e){//ここで何かをする} catch(例外2 e){//ここで何かをする}最後に{//最後にブロックは常に実行されます//ここで何かをする} trycatchfinallydemo.java
パッケージcom.yiibai.tutorial.exception.basic; public class trycatchfinallydemo {public static void main(string [] args){string text = "001234a2"; int value = tointeger(text); System.out.println( "value =" + value); } public static int tointeger(string text){try {system.out.println( "テキストを開始する:" + text); //例外はここにスローできます(NumberFormateXception)。 int value = integer.parseint(text);返品値。 } catch(numberformatexception e){//「テキスト」の場合は数字ではありません。 //このキャッチブロックは実行されます。 system.out.println( "番号形式例外" + e.getMessage()); // numberformatexceptionが発生した場合に0を返します0; }最後に{system.out.println( "end parse text:" + text); }}}これがプログラムのプロセスです。最終的なブロックは、どんな状況でも常に実行されます。
5。周囲の例外
person.java
パッケージcom.yiibai.tutorial.exception.wrap; public class person {public static final string male = "male"; public static final string female = "female";プライベート文字列名;プライベートストリングジェンダー;プライベートインクエイジ;パブリックパーソン(文字列名、文字列ジェンダー、int age){this.name = name; this.gender = gender; this.age = age; } public string getname(){return name; } public void setName(string name){this.name = name; } public string getGender(){return gender; } public void setgender(string gender){this.gender = gender; } public int getage(){return age; } public void Setage(int age){this.age = age; }} genderexception.java
パッケージcom.yiibai.tutorial.exception.wrap; // gender exception.public class genderexceptionは例外{public genderexception(string message){super(message); }} validateExceptionクラスパッケージには、他の例外があります。
validateException.java
パッケージcom.yiibai.tutorial.exception.wrap; public class validateExceptionは例外を拡張します{//例外public validateException(例外e){super(e); }} validateutils.java
パッケージcom.yiibai.exception.wrap;インポートcom.yiibai.tutorial.exception.exception.basic.ageutils; public class validateutils {public static void checkerson(person person)throws validateException {try {// check age。 // 18-40の間に有効//この方法がToololdException、Tooyoungexceptionをスローできる場合。 ageutils.checkage(person.getage()); } catch(例外e){//有効でない場合// validateExceptionによってこの例外をラップし、新しいvalidateException(e)をスローします。 } //その人が女性の場合、つまり無効です。 if(person.getGender()。equals(person.female)){genderexception e = new genderexception( "女性を受け入れない");新しいvalidateException(e)をスローします。 }}} wrapperexceptiondemo.java
パッケージcom.yiibai.exception.wrap; public class wrapperexceptiondemo {public static void main(string [] args){// 1人の参加者募集。 Person Person = new Person( "marry"、person.female、20); {//例外がここで発生する場合があります。 validateutils.checkperson(person); } catch(validateException wrap){//実際の原因を取得します。 // Tooyoungexception、TooldException、Genderexception Exception courd =(Exception)wrap.getCause(); if(courd!= null){system.out.println( "pass、courd:" + cound.getmessage()); } else {system.out.println(wrap.getMessage()); }}}}6. runtimeexceptionおよびsubclass runtimeexceptionクラスとそのサブクラスはどちらも「未確認の例外」です。 Javaコンパイラによってコンパイル時にチェックされません。場合によっては、このブランチから継承して独自の例外を書くことができます。
以下は、RuntimeExceptionブランチに属するクラスです(もちろん、これだけではありません)。
このタイプの処理例外のいくつかの例:
6.1- nullyibaierexception
これは最も一般的な例外であり、通常、プログラムにエラーを引き起こします。メソッドを呼び出すか、空のオブジェクトのフィールドにアクセスすると、例外がスローされます。
nullyiibaierexceptiondemo.java
パッケージcom.yiibai.tutorial.exception.runtime; public class nullyibaierexceptiondemo {//たとえば、ここにnull文字列を返すことができる方法があります。 public static string getString(){if(1 == 2){return "1 == 2 !!"; } nullを返します。 } public static void main(string [] args){//これはnullではないオブジェクトです。文字列text1 = "こんにちは例外"; //メソッドを呼び出して、文字列の長さを取得します。 int length = text1.length(); System.out.println( "長さtext1 =" + length); //これはnullを参照するオブジェクトです。文字列text2 = getString(); //メソッドを呼び出して、文字列の長さを取得します。 // nullyiibaierexceptionはここで発生します。 //それは実行時に発生する例外(runtimeexceptionのタイプ)// javacコンパイラは、トライキャッチブロックを使用して長さ= text2.length()を処理することを強制しません。 system.out.println( "finish!"); }}例を実行する結果:
実際には、Try-Catchを使用して、他の例外を処理するときのように、この例外をキャッチおよび処理できます。ただし、これは機械的であり、通常、オブジェクトを使用する前にオブジェクトがnullでないことを確認する必要があります。
上記のコードを修正して、次のコードに似ています。ヌルポインターの例外を避けることができます。
//これはnull object.string text2 = getString(); //「text2」がtry-catch.if(text2!= null){length = text2.length();}を使用する代わりにnull.//を確認していることを確認するためにチェックします。 6.2- arrayindexofboundexception
この例外は、無効なインデックスを持つ配列要素にアクセスしようとすると発生します。たとえば、配列にはアクセスする10の要素がありますが、インデックス20の要素にアクセスしています。
Arrayindexofboundsexceptiondemo.java
パッケージcom.yiibai.tutorial.exception.runtime; public class arrayindexofboundsexceptiondemo {public static void main(string [] args){string [] strs = new String [] {"one"、 "2 two"、 "3"}; //要素へのアクセスにはインデックス0。stringstr1 = strs [0]; System.out.println( "String at 0 =" + str1); //要素へのアクセスにはインデックス5があります。 string str2 = strs [5]; System.out.println( "String at 5 =" + str2); }} arrayindexofboundsexceptionを避けるために、Try-Catchを使用するよりも、配列をチェックすることについての方が必要です。
if(strs.length> 5){string str2 = strs [5]; system.out.println( "string at 5 =" + str2);} else {system.out.println( "インデックス5"の要素なし);}上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。