Javaの例外処理
例外は、プログラム内のいくつかのエラーではなく、すべてのエラーは例外で、時にはミスを回避することができます。
たとえば、あなたのコードは、以下のセミコロンは、その後、結果を使い果たすと、間違ったでjava.lang.Errorを促すことで、あなたはのSystem.out.println(11/0)を使用する場合、あなたはやっているあなたが除数0を使用しているためそれはjava.lang.ArithmeticException例外がスローされます。
例外発生には多くの理由がありますが、通常は以下のカテゴリが含まれています。
- ユーザ入力不正なデータ。
- 存在しないファイルを開きます。
- ネットワーク通信接続が中断またはJVMメモリのオーバーフローです。
ユーザー・エラーが原因のいずれかのこれらの例外は、他の物理的なエラーがあるため、いくつかの手続きのエラーが原因と発生します。 -
Javaの例外処理を理解するには、あなたが、例外は、次の3種類を持っている必要があり、それがどのように動作するかです:
- チェック例外:最も代表的な例外がユーザー・エラーや問題が原因例外で、それはプログラマが予測不可能である確認しました。 例えば、あなたは例外が単にコンパイル時には無視できない、例外が発生し、存在しないファイルを開きたいとき。
- 実行時例外:例外が異常動作を回避するために、プログラマである可能性が高いです。 チェック例外とは対照的に、ランタイム例外は、コンパイル時に無視することができます。
- エラー:エラーは異常ではありませんが、プログラマの制御の問題から。 コードのエラーは、通常は無視されます。 スタックオーバーフローが、エラーが発生した場合例えば、それらはコンパイル時にチェックすることができません。
例外クラス階層
すべての例外クラスはjava.lang.Exceptionをサブクラスから継承します。
ExceptionクラスはThrowableクラスのサブクラスです。 例外クラスに加えて、Throwableのエラーのサブクラスがあります。
Javaプログラムは、通常、エラーをキャッチしません。 重大な障害が、彼らはJavaプログラムの処理の外からも見えますとすると、エラーは、一般的に発生します。
エラーランタイム環境は、発生するエラーを示すために使用されます。
たとえば、JVMのメモリのオーバーフロー。 一般的には、プログラムがエラーから回復しません。
IOExceptionクラスとのRuntimeExceptionクラス:Exceptionクラスは、主に2つのサブカテゴリーがあります。
内蔵のJavaクラス(次を説明する)、それは通常のチェックとチェックされない例外のほとんどを持っています。
内蔵のJava例外クラス
Java言語は、標準のjava.langパッケージにいくつかの例外クラスを定義します。
標準ランタイム例外クラスは、最も一般的な例外クラスのサブクラスです。 異常が継承されたランタイム例外クラスからほとんどが直接使用することができるように、java.langパッケージので、すべてのJavaプログラムにデフォルトでロードされます。
さまざまなJavaクラスライブラリによると、他の例外の数を定義し、以下の表は、Javaチェックされない例外が一覧表示されます。
異常な | 説明 |
---|---|
ArithmeticException | ときに異常動作条件は、この例外がスローされます。 たとえば、整数「ゼロによる除算」はこのクラスのインスタンスをスロー。 |
ArrayIndexOutOfBoundsExceptionが | 不正なインデックスを使って投げ配列にアクセスします。 インデックスが負またはより大きいまたは配列の同じサイズである場合は、インデックスが不正なインデックスです。 |
ArrayStoreExceptionが | スローされた例外の配列にオブジェクトの間違った種類を保存しようとしています。 |
ClassCastExceptionが発生 | あなたがオブジェクトをキャストしようとするとスローされますサブクラスのインスタンスではありません。 |
IllegalArgumentException | この方法は、違法または不適切な引数を渡したことを示すためにスローされます。 |
ないIllegalMonitorStateException | スレッドがオブジェクトのモニターで待機するように、または他のオブジェクトが指定されたモニタなしスレッドモニターを待っている通知しようとしたことを示すためにスローされます。 |
IllegalStateExceptionが | 違法または不適切な時間の場合に信号を生成するメソッドを呼び出します。 つまり、Java環境またはJavaアプリケーションは、要求された操作のための適切な状態ではありません。 |
ないIllegalThreadStateException | 必要な要求された操作がスローされたときにスレッドが適切な状態ではありません。 |
例外:IndexOutOfBoundsException | これは、範囲外のスロー(例えば、配列、文字列やベクトルを並べ替えなど)のソートインデックスを示します。 |
ないNegativeArraySizeException | アプリケーションが負のサイズを持った配列を作成しようとした場合に、スローされます。 |
NullPointerExceptionが発生 | アプリケーションは、ローカルのニーズにオブジェクトを使用しようとするとnull 場合にスローさ |
NumberFormatExceptionが | アプリケーションが数値型に文字列を変換しようとしますが、文字列を適切な形式に変換することができない場合には、異常をくぼみました。 |
SecurityExceptionが | セキュリティマネージャが例外をスローすることで、セキュリティ違反を示しています。 |
StringIndexOutOfBoundsExceptionを | この例外String インデックスが負または文字列のサイズより大きいことを示すための方法をスローします。 |
UnsupportedOperationExceptionを | 要求された操作がスローされ、サポートされていない場合。 |
次の表は、java.langパッケージで定義されるJava例外クラスをチェックし一覧表示されます。
異常な | 説明 |
---|---|
ClassNotFoundException | アプリケーションのクラスをロードしようとすると、あなたがスローされ、対応するクラスを見つけることができません。 |
CloneNotSupportedException | あなたが呼び出すとObject クラスのclone オブジェクトのクローンを作成する方法を、そのオブジェクトのクラスを実装することはできませんCloneable スローされインターフェイスを。 |
IllegalAccessExceptionが | スローされたクラスへのアクセスを拒否された場合。 |
ないInstantiationException | あなたが使用しようとするとClass クラスnewInstance がインタフェースまたは抽象クラスはインスタンス化できないため、クラスメソッド、指定されたクラスのオブジェクトのインスタンスを作成し、異常をくぼみました。 |
InterruptedExceptionあります | スレッドが別のスレッドによって中断された、この例外がスローされます。 |
ないNoSuchFieldException | 変数が存在しない要求 |
ないNoSuchMethodException | 要求されたメソッドは存在しません。 |
異常
以下のリストは、mainメソッドThrowableクラスです。
いいえ。 | メソッドと説明 |
---|---|
1 | 公共の文字列のgetMessage() 例外が発生した詳細情報を返します。 Throwableクラスのコンストラクタで初期化されたニュース。 |
2 | 公衆のThrowableのgetCause() 例外の理由を表すThrowableオブジェクトを返します。 |
3 | 公共の文字列のtoString() getMessage()を使用した結果はカスケードのクラスの名前を返します。 |
4 | 公共ボイドのprintStackTrace() 印刷のtoString()結果およびSystem.err、すなわちエラー出力ストリームへのスタックレベル。 |
5 | 公共のStackTraceElement [] getStackTraceメソッド() これは、スタックレベルを含む配列を返します。 0添字要素はスタックの最上部を示し、最後の要素は、スタックのメソッド呼び出しスタックの底部を表します。 |
6 | 公衆のThrowableにfillInStackTrace() スロー可能オブジェクトスタックは、以前の情報のスタックレベルに追加されたコール・スタック・レベルの現在のレベルで充填されています。 |
例外をキャッチ
tryおよびcatchキーワードは、例外をキャッチすることができます使用してください。 発生する可能性のある場所例外で/ catchブロックを試してみてください。
構文try / catchブロックのコードはのtry / catchを使用して、保護コードと呼ばれ、次のとおりです。
try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 }
catchステートメントは、ステートメントのタイプをキャプチャするために例外が含まれています。 例外が発生した保護コードブロックは、catchブロックの背面をしようとするとチェックされます。
例外がcatchブロックに含まれている場合は、例外がcatchブロックに渡され、このメソッドにパラメータを渡すことになりますと同じです。
例
次の例では、コードは、それが例外をスローしますときに、配列の3番目の要素にアクセスしようとしたとき、2つの要素の配列を宣言しました。
// 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } }
上記のコードのコンパイルと次の出力を実行します。
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block
複数のcatchブロック
コードブロックの後にキャッチ複数のコードブロックは、複数のキャプチャに従うことを試して呼ばれています。
複数のcatchブロックの構文は次のとおりです。
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }
上記のコードは、3 catchブロックが含まれています。
あなたは、try文の背後にあるcatchブロックの任意の数を追加することができます。
例外は保護コードで発生した場合、例外は最初のcatchブロックにスローされます。
あなたはそれがキャプチャされますExceptionType1、のデータ型の不一致例外をスローした場合。
そうでない場合、それは、第2のキャッチブロックに転送されます。
だから、例外まで、任意のキャッチまたはブロックでキャッチされています。
例
この例では、複数のtry / catchを使用する方法を示しています。
try { file = new FileInputStream(fileName); x = (byte) file.read(); }catch(IOException i) { i.printStackTrace(); return -1; }catch(FileNotFoundException f) //Not valid! { f.printStackTrace(); return -1; }
スロー/キーワードを投げます:
メソッドがチェック例外を捕捉しない場合、メソッドは宣言するためにキーワードをスロー使用する必要があります。 メソッドのシグネチャの最後にキーワードをスローします。
また、それは新しいものであるか、新たに撮影しインスタンス化するかどうか、例外をスローキーワードスローを使用することができます。
次のメソッドの宣言は、RemoteExceptionの例外がスローされます。
import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition }
この方法は、複数の例外の間にコンマで区切って複数の例外をスローするように宣言することができます。
たとえば、次のメソッドの宣言は、RemoteExceptionをとInsufficientFundsExceptionがスローされます。
import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition }
最終的にはキーワード
最後に、キーワードは、コードブロックを実行しようとした後にコードブロックを作成するために使用されます。
例外が発生したか否か、最終的にコードブロックコードは常に実行されます。
finallyブロックでは、ステートメントの終了の種類の性質の余波をクリーンアップ実行することができます。
finallyブロックが最後にcatchブロックで表示され、次のように、構文は次のとおりです。
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
例
public class ExcepTest{ public static void main(String args[]){ int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } }
次のような結果をコンパイルした上記の例は次のとおりです。
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed
以下の事項ことに注意してください:
- キャッチは、独立試行の存在することはできません。
- try / catchブロックは、最終的には必須の要件の後に追加されていません。
- いないのtry catchブロックの後にどちらも最終的にブロックしませんでした。
- finallyブロックの間の任意のコードを追加することはできません、キャッチ、試してみてください。
ステートメントカスタム例外
Javaでは、あなたは例外をカスタマイズすることができます。 以下の点は、独自の例外クラスを記述するために覚えておく必要があります。
- すべての例外はThrowableのサブクラスでなければなりません。
- あなたがチェック例外クラスを記述したい場合は、Exceptionクラスを継承する必要があります。
- あなたはランタイム例外クラスを作成したい場合は、のRuntimeExceptionクラスを継承する必要があります。
あなたはこのような独自の例外クラスを定義することができます。
class MyException extends Exception{ }
唯一の例外クラスは、例外クラスをチェックしている作成する例外クラスを継承します。
次InsufficientFundsExceptionクラスはExceptionから継承するユーザ定義の例外クラスです。
例外クラスとその他のクラスは、変数やメソッドが含まれています。
例
// 文件名InsufficientFundsException.java import java.io.*; public class InsufficientFundsException extends Exception { private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } }
当社のカスタム例外クラスを使用する方法を実証するために、
次CheckingAccountクラスで撤退()メソッドが例外InsufficientFundsExceptionがスローされています。
// 文件名称 CheckingAccount.java import java.io.*; public class CheckingAccount { private double balance; private int number; public CheckingAccount(int number) { this.number = number; } public void deposit(double amount) { balance += amount; } public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } public double getBalance() { return balance; } public int getNumber() { return number; } }
次のプログラムは、呼び出しBankDemo CheckingAccountクラスの預金()及び()メソッドを撤回する方法を示します。
//文件名称 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } }
上記の3つのファイルをコンパイルして、プログラムBankDemoを実行し、次のような結果が得られます。
Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25) at BankDemo.main(BankDemo.java:13)
一般的な例外
これは、Javaで例外やエラーの2つのタイプを定義します。
- JVM(Java 仮想マシン) 例外:JVMまたはエラーによってスローされた例外。 たとえば、次のようにNullPointerExceptionクラス、ArrayIndexOutOfBoundsExceptionがクラスは、ClassCastExceptionクラス。
- プログラム・レベルの例外:APIプログラムによってプログラムまたはスロー。 例えばクラスはIllegalArgumentExceptionは、IllegalStateExceptionクラスの。