Javaは、エラー条件と応答機構の一貫性を同定する方法のために - 例外処理、例外処理を効果的に簡単にデバッグするために、プログラムをより堅牢にすることができます。このブログの意志の詳細Javaの例外処理(例外)。
内容:
顧客の入力データ:など、多くの問題は、コードによって避けることができないがあるので完璧を書き込みコードにプログラマが、それでも、システムの動作中に何らかの問題が発生した場合でも、コンピュータ言語のプロジェクトの開発を使用するプロセスでフォーマットは、ファイルが存在読んで、ネットワークがオープンし、そうで残っていること。そして、あなたは問題の一部を解決するためにJavaの例外処理メカニズムを使用する必要があり、合理的な使用の例外処理メカニズムは、バグを減らすプログラムの堅牢性を向上させることができます。
☍異常と異常なアーキテクチャの概要
▴異常概要
☃例外:Java言語では、通常と呼ばれるプログラムの実装では発生しません「異常」。(開発プロセスの構文エラーと論理エラーは珍しいことではありません)
☃発生したJavaプログラムの実行中に異常なイベントは、2つのカテゴリに分けることができます。
➢ エラー:深刻な問題は、Java仮想マシンによって解決することはできません。以下のような:内部JVMシステムエラー、資源の枯渇やその他の深刻な状態。例えば:スタックオーバーフローエラー:にStackOverflowErrorとヒープオーバーフローエラー:OOM(OutOfMemoryErrorが発生)。一般的に、書き込み原因エラーにコードを修正し、例外処理コードを対象としません。
public class ExceptionTest {
public static void main(String[] args) {
//栈(statck)溢出异常: java.lang.StackOverflowError
//main(args);
//堆(heap)溢出异常:java.lang.OutOfMemoryError
//Integer[] arr = new Integer[1020*1024*1024];
}
}
➢ 例外:エラーや不慮の外部要因をプログラミングすることによって引き起こされる他の一般的な問題は、あなたが処理対象のコードを使用することができます。例えば:
✔NULLポインタアクセス
✔存在しないファイルを読み取ろうとします
✔ネットワーク接続が中断され、
範囲外の✔配列の添字
☃これらのエラーのために、2つの解決策があります:第一に、それはエラーがプログラム(デフォルト)を終了遭遇します。アカウントにエラー取るためのプログラム書き込み時にもう一つの方法は、プログラマがある
検出、エラーメッセージ、およびエラー処理を(主に珍しい方法を解決するために)。
☃コンパイル時にキャッチエラーが最善ですが、多少の誤差は、このような配列の範囲として、実行時にのみ発生します。
☃異なる捕捉時間を分けることができます:编译时异常
と运行时异常
。
▴例外異常なカテゴリー:異常が実行&コンパイル時の例外
コンパイル時の異常
☃コンパイラが例外を処分しなければならないことを要求を意味します。これは、外部要因による実行時例外では一般的なプログラムです。異常なコンパイラは、Javaプログラムがすべてのコンパイラをキャプチャするか、宣言する必要がありますが必要です。
RuntimeException例外クラスおよびそのサブクラスを除く☃のJavaは、異常に上図に対応する被写体の異常をコンパイルしています。異常な状況は、それ以外のプログラムは、このような異常読取空のファイルとして、コンパイルされません、例外に対処する必要があるが存在するならば、コンパイル時の異常な機能は、Javaコンパイラは、チェックされますされています。
プログラムは処理しない場合☃ような例外のために、それは予期しない結果をもたらす可能性があります。
☃例外は、次のように、2つの方法があり、コンパイル時の処理します:
(1)異常な処理を捕獲しようと... catch文を使用して。
発信者が例外をスローしていない場合にスローされる例外を宣言するキーワードスロー用いて(2)は、その処理のために、発信者を待ち、処理は継続します。
ランタイム例外
☃コンパイラは珍しい強制処分を必要としないことを意味します。一般的に、論理エラーにプログラミングする場合、プログラマは積極的に異常が発生することは避けてくださいを参照します。異常なjava.lang.RuntimeExceptionクラスとそのサブクラスが実行されています。
☃ランタイム例外が例外時にこのようなプログラムでも使用トライなし...キャッチ文のキャプチャに発生したり、プログラムの缶を投げ宣言するキーワードスローでチェックされませんJavaコンパイラ、ことを特徴としていますそのような配列の添字境界例外としてコンパイル(ランタイムエラーがあってもよいです)。
☃そのような例外のために、(正しい論理を決定するとき)場合月選択処理(わからない論理が正しい)、または無処理として、全体のプロセスが生成するために、プログラムの可読性と効率である可能性がある場合、このような異常は、共通しているのでインパクト。
☍一般的な異常
▴共通異常走行:java.lang.RuntimeExceptionそのサブクラス
nullポインタ例外NullPointerExceptionが発生
public void NullPointerExceptionDemo() {
Object obj = null;
System.out.println(obj.toString());
}
配列の添字の境界例外:ArrayIndexOutOfBoundsExceptionが
public void ArrayIndexOutOfBoundException1() {
int[] arr = new int[3];
System.out.println(arr[5]);
}
public void ArrayIndexOutOfBoundException2() {
String string = "abcd";
System.out.println(string.toCharArray()[5]);
}
文字列の添字の境界例外:StringIndexOutOfBoundsExceptionを
public void StringIndexOutOfBoundExceptionDemo() {
String str = "abcd";
System.out.println(str.charAt(5));
}
タイプキャスト例外:java.lang.ClassCastExceptionが
public void ClassCastExceptionDemo() {
class Dog{
}
class Cat{
}
//Dog dog = new Cat(); 编译不通过,语法错误
Object obj = new Dog();
Cat cat = (Cat)obj;
}
異常なデジタルフォーマット:java.lang.NumberFormatException
public void NumberFormatExceptionDemo(){
String str = "abc";
//Integer number = new Integer(str);
int num = Integer.parseInt(str);
}
異常コンソールの入力フォーマット:java.util.InputMismatchExceptionDemo
public void InputMismatchExceptionDemo() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数字:");
int num = scanner.nextInt();
//控制台输入不符合规则时报的异常:如此时输入非数字字符
System.out.println(num);
}
算術異常:java.lang.ArithmeticException
public void ArithmeticExceptionDemo() {
int a = 4;
int b = 0;
System.out.println(a / b);
}
とき▴共通コンパイラ例外:他の外ののRuntimeExceptionに加えて、例外クラス
コンパイル☃コンパイル時を思い出させるために例外は、それはコンパイル時に例外を処理するために、プログラマが必要です
☃共通コンパイル時の異常は、次のとおりです。
◌SQL異常:java.sql.SQLExceptionの(例外データベースアクセスエラーまたは約他のエラーメッセージ)
フロー◌IO例外:java.io.IOExeption(。特定のI / O例外が発生し、汎用的なクラスの例外を生成したI / O操作のような障害や中断がスローされます。)
• java.io.FileNotFoundException(指定されたパス名がスロー失敗したファイルを開こうとすると)
•入力処理で表現java.io.EOFExceptionが(予期せず終了またはファイル・ストリームの終わりに達した。これは異常ストリームの終わりを示すために、データ入力ストリームから構成されています。してくださいノート他の多くの入力操作は、ストリームの終わりに特別な値を返すことを、代わりに例外をスローします。)
◌異常指定されたクラスを見つけることができません:java.lang.ClassNotFoundExceptionがします
◌データフォーマット異常(データフォーマットエラーがこの例外がスローされる)java.util.zip.DataFormatException
◌方法例外が見つかりません:ないNoSuchMethodExceptionを(特定のメソッドが見つからない場合、スロー)
◌割り込み例外:java.lang.InterruptedExceptionは、(スレッドが眠っている、待っている、またはそうでなければ投げたときに、現在のスレッドが中断されているかどうか、活動の間に糸切れが時折、メソッドがテストしたいことがあり、そうであれば、すぐにスロー占有されています。例外)
☍例外処理メカニズム
プログラミング、しばしば結合されるローカルコード検出エラーが発生する可能性を有する場合
、そのような実行のx / yの操作として、分母を検出する0で、データは、入力データではなく、文字等空です。プログラムの過度のif-else分岐コードが長く、肥大化し、貧しい可読性につながります。したがって、例外処理メカニズムを使用して。
☃使用されるメカニズムを扱うJava例外は、一緒に処理プログラムコード例外であり、通常のプログラムコードとは別に、プログラムが簡単になり、エレガント、及び保守が容易。
try-catchが、最終的には+モードと異常モードの種類をスロー:☃Javaの例外処理モードが分かれています。
☃Javaが提供しては、例外処理モデルを投げてキャッチされます。
このような異常として実行☃Javaプログラムは、例外クラスのオブジェクト、例外オブジェクトは、Javaランタイムシステム、スローとして知られるプロセスに提出される生成
(スロー)例外。
例外がスローされると☃後続のコード内のオブジェクトプログラムは、{}は実行されない場合。
生成された例外オブジェクト:
☃仮想マシンによって自動的に生成される:プログラムが実行され、仮想マシンが現在のハンドラコード内に見つからない場合、自動的にオブジェクト・クラスの例外の対応するインスタンスを作成し、発生したことを検出するプログラムの問題は、バックグラウンドとでスローされます - - 自動スロー
☃などの開発者によって手動で作成:例外の例外=新しいのClassCastException();良いを作成するように、プログラムに影響を与えない例外オブジェクトを投げると、共通オブジェクトを作成しません。
メソッドが例外をスローした場合☃、例外オブジェクトは、処理の呼び出し元メソッドにスローされます。例外は、呼び出し元の方法で処理されていない場合は、メソッドの呼び出し、このメソッドの先頭にスローされ続けています。例外が処理されるまで、このプロセスは、無期限に継続されます。このプロセスは、キャプチャ(キャッチ)の例外と呼ばれています。
☃main()メソッド、および(メイン)に例外バックが処理されない場合は、プログラムの実行を終了します。
エラー非力ながら☃プログラマは通常のみ、例外を処理します。
✦呼び出し側にスローされる例外ことができ、コードの実行中に発生する可能性のある例外に対処しなければならないコードの正常な実行を確保するために、しかし、例外は一度に扱わなければならない、というよりも治療せずに投げられて。
☍例外は、機構Aを扱う:のtry-catch-最後に
try-catchを:
☃例外処理はのtry-catch-finally文を通じて達成されます。
try {
//可能产生异常的代码
}
catch (异常类型1 变量名1) {
// 当产生指定类型(包括子类)的异常时的处理措施
}
catch (异常类型2 变量名2) {
// 当产生指定类型(包括子类)的异常时的处理措施
}
...
finally { //finally根据情况可加可不加
//无论是否发生异常,都会执行的语句
}
//其他代码
最初のステップは、キャッチ例外である☃{...}キャッチ例外試行の選択された範囲を有するブロックは、異常コードはtryブロックで可能です。例外が発生すると、オブジェクトは、キャッチに一致するように、このオブジェクトの種類に応じて、それぞれの例外クラスを生成します。
☃キャッチ(Exceptiontype e)はステートメントブロック例外オブジェクトコードの処理です。各tryブロックが生成される可能性のあるオブジェクトの異なるタイプの例外処理のための1つまたは複数のcatchステートメントを伴うことがあります。
☃異常トライは1つのキャッチと一致するようにすると、キャッチは、コードは、その後、ダウン続けて現在のtry-catch構造のうち一度処理が完了すると、異常処理に入ります。
例外の正確にどのようなものが発生した場合↪知っている、例外のタイプは、キャッチのパラメータとして使用することができ、親クラスがキャッチのパラメータとしても使用することができます。
例えば:はArithmeticExceptionクラスをパラメータとして使用することができ、それを引数として、すべての例外の例外クラスのパラメータのRuntimeExceptionクラスまたは親クラスとして使用することができます。しかし、それはNullPointerExceptionなどはArithmeticExceptionクラスの例外、(catchステートメントが行れません)に無関係なことはできません。
☃親の子の関係が存在しない場合は、例外の種類をキャッチし、ステートメントは、子親関係が成立している場合は、例外タイプをキャッチした場合、上記で特定のステートメントのサブクラスは親クラスを必要とし、それ以外の場合はエラーを順番に影響を与えませんでした。
異常についての情報をキャプチャ:
☃他のオブジェクトと同じように、あなたは例外オブジェクトのメンバ変数にアクセスしたり、その呼び出すことができる
方法を。
➣のgetMessage()は文字列を返し、異常情報を取得します
➣のprintStackTrace()は、例外クラスおよび例外情報、並びにプログラムの異常の位置を取得します。戻り値のボイド。
public static void tryCatchFinally() {
try {
//可能产生异常的代码
int arr[] = new int[3];
System.out.println("开始执行");
arr[4] = 232;
//出现异常后,{}其后的代码不再执行
System.out.println(arr[4]);
}catch (NumberFormatException e) {
//数字格式异常
System.out.println("数字格式异常");
}
/*子类异常一定声明在父类的上面
catch (IndexOutOfBoundsException e) {
}*/
catch (ArrayIndexOutOfBoundsException e) {
// 当产生指定类型(包括子类)的异常时的处理措施
System.out.println("数组越界异常");
//异常对象中的getMessage()方法,返回字符串类型的异常信息
System.out.println("getMessage方法:" + e.getMessage());
//异常对象中的printStackTrace()方法
e.printStackTrace(); //控制台输出详细的异常信息
} catch (Exception e) {
System.out.println("出现异常");
}finally {
//无论是否发生异常,都会执行的语句
System.out.println("ArrayIndexOutOfBoundsException Test");
}
//其他代码
//try-catch中定义的变量出了try-catch范围就不能使用了,除非将变量定义在try-catch前面
//arr[1] = 10;
System.out.println("orther code");
}
出力:
✦使用のtry-catch-最後にコンパイル例外処理、そのプログラムはもはや、コンパイル時に指定されているが、それでものtry-catch-最後に例外が発生する可能性があります使用して実行時にエラーがあってもよいこと、コンパイル時と同等になり、実行時まで延期表示されます。
最後に:
☃最後にcatch文と文はオプションですが、少なくとも一つが存在しなければなりません。
最後のステップ☃キャッチ例外ができるように、前に制御フローがプログラムの他の部分に行くように、輸出を扱う最終的に例外で統一された声明を提供することで
プログラムの状態を一元管理を行います。
☃異常事象は、tryブロックに戻りcatch文があるかどうか、例外catch文は、存在する場合、ブロック内の最後に文が実行されます、かどうかをcatch文を発生するかどうか。
☃が最終的に実行されますので、メソッドが値を返す場合、戻り値は、戻り値のtry-catchが上書きされた場合、そう、最終的にも定義されて
@SuppressWarnings("finally")
public int test1() {
try {
int a = 23;
int b = 0;
System.out.println(a / b);
return 0;
} catch (ArithmeticException e) {
e.printStackTrace();
return -1;
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
System.out.println("执行到最后了");
//返回值会覆盖try-catch中的返回值
return 1;
}
}
出力:
☃JVMは自動的に、このようなソケットネットワークプログラミングなどのリソースデータベース同様のリンク、入力および出力ストリームを、回復することはできませんので、我々は最終的に最も適切に定義し、手動でシャットダウンにリソースを解放する必要がある(異常な原因コードに影響を防止するためには実行されません)
public void test2() {
//定义在try-catch前面,方便try-catch后面的使用
FileInputStream fis = null;
try {
File file = new File("abc.txt");
fis = new FileInputStream(file);
int data = fis.read();
while(data != -1) {
System.out.print((char)data);
data = fis.read();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流,try-catch可以嵌套使用
try {
if(fis != null) //避免空指针
fis.close();
} catch (IOException e2) {
e2.printStackTrace();
}
}
System.out.println("end");
}
例外をキャッチしていないVSキャッチ例外
☃のRuntimeExceptionクラスまたはそのサブクラスは、珍しいこれらの特別なクラスの
ポイントは次のとおりです。でも、使用のtryおよびcatchキャプチャせずに、Javaの私は(実行時例外が発生したが、プログラムの実行が終了されますされます)によって捕獲され、コンパイルすることができます。
例外が例外である場合☃、あなたはにIOExceptionと非動作の他のタイプ、それ以外の場合はコンパイルエラーを取得する必要があります。我々は実行時例外にコンパイル対処する必要が言い換えれば、異常、異常なキャプチャ。
☍メカニズム2例外処理は:例外がスローされるスロー
声明投げ
☃文は例外が第二の方法でJavaの例外処理でスロー
☄方法は、異常のいくつかの種類を生成することができますが、必ずこの処理方法をされていない場合(文が実行されている場合)
が、ことにより、異常の種類を、明示的に例外を宣言する必要があり、このメソッドは、メソッドはこれらの異常に対処しないことを示し、スローされますに対処するためのメソッドの呼び出し元。
☄は、その親であってもよいし、スロー例外リストは、例外タイプのバックは、例外タイプは、プロセスで製造することができるスローという宣言文の方法でスローされます。
☃がスローすると、メソッドのボディタイプの実行時例外がスローされる可能性があり、かつコードのコードと、メソッド本体に例外オブジェクトを生成します一度例外が例外、このメソッドの実装を示し、メソッド宣言では、書き込みに早く過ぎるの道をスローされますダウン継続しない、この目的が満たされる例外タイプは後者の例外コードが実行されない、インビボの方法において、スローされるスロー
メソッドが例外をスローした場合☃、例外オブジェクトは、処理の呼び出し元メソッドにスローされます。例外は、呼び出し元の方法で処理されていない場合は、メソッドの呼び出し、このメソッドの先頭にスローされ続けています。最後の例外が処理またはJVM仮想マシンをスローされるまで、このプロセスは、無期限に継続されます。main()メソッド、および(メイン)に例外バックが処理されない場合は、プログラムの実行を終了します。
try-catch-ついに↪:本当に例外を処理され、例外がスローされます。唯一の例外は、発信者が実際に例外を処理しないスロー
public class ThrowsException {
static FileInputStream fis = null;
public static void main(String[] args) {
ThrowsException t = new ThrowsException();
//调用者处理异常
try {
t.getReadFile();;
} catch (IOException e) {
System.out.println("出现异常");
e.printStackTrace();
}finally {
//关闭io流
try {
if(fis != null)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("finally");
}
}
//调用者继续抛出异常,IOException是FileFoundException父类,若对于两个异常不做区分处理,则抛出父类异常即可
public void getReadFile() throws IOException {
String filePath = "abc.txt";
readFile(filePath);
}
//声明抛出异常
public void readFile(String filePath) throws FileNotFoundException,IOException{
File file = new File(filePath);
// 读文件的操作可能产生FileNotFoundException 类型的异常
fis = new FileInputStream(file);
int data = fis.read();
while(data != -1) {
System.out.print((char)data);
data = fis.read();
}
System.out.println("方法体末尾");
}
}
出力:
スローされるプロセス
原則例外をスローオーバーライドメソッド
☃オーバーライドされたメソッドは、メソッドの型が範囲を上書きされるよりも多くの例外をスローすることはできません。多状態の場合には、methodA()メソッドの呼び出し - 例外処理親クラス宣言によって例外を捕捉します。
☃メソッドがオーバーライド親クラスがハンドル例外にない方法をスローされていない場合は、サブクラスが使用することはできませんオーバーライドされたメソッドは、例外が、異常は書き換えがある場合、サブクラスのメソッドは、あなたがtry-を使用する必要があることを今回手段を投げられるスロー処理キャッチ最終的な実施形態。
public class A {
public void methodA() throws IOException {……}
public void methodB() {……}
}
public class B1 extends A {
public void methodA() throws FileNotFoundException {……}
//public void methodB() throws FileNotFoundException {……} 报错
}
public class B2 extends A {
public void methodA() throws Exception { // 报错……}
public void methodB(){
try{...}
catch(ExcptionType e){...}
finally{...}
}
}
例外処理の方法を選択します
実行、およびコールの方法は、いくつかの他の方法を有し、ターン進行性の関係(これらの方法は、例えば:方法A、方法B、Bが要求を与える方法C、方法C、方法Dのデータを取得する必要が呼び出しデータ)、これらのメソッドが呼び出さのtry-catch-最終的に取り扱う方法aを実行するとき、それは保証することができ、他のメソッドが呼び出されるメソッドを使用することを検討して実行中に例外がスローされるスローで使用することをお勧めします集中例外処理を容易にしながら、異常の発生に影響を与えるように配置されていない場合。
try-catch-最終的には、例外処理があり、その後、何の意味がスローされないための方法を例外処理キャッチ最終的に試してみてのみ使用するものを選択例外処理をスローし、理由は同じ時間の使用で、使用することはできません。
☍手動で例外を投げます
異常がシステムと投(上記生成され、自動的にJVM)によるプログラム実行中に発生し、手動で作成し、必要に応じて作るスローすることができる場合に加えて、Javaの例外クラスのオブジェクトが自動的に生成されました。
☃最初のクラスは、(スロー文によって達成Javaランタイムに提出例外オブジェクト、その後、投げ操作生成
ライン環境を)。
public class ThrowTest {
public static void main(String[] args) {
ThrowTest t = new ThrowTest();
try {
t.method(-2);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void method(int num) throws Exception{
int i = 0;
if(num >= 0) {
i = num;
}else {
throw new Exception("数字不能小于0");
}
}
}
ユーザー定義の例外クラス☍
☃一般に、ユーザ定義のクラスはのRuntimeExceptionのサブクラスであります
通常、いくつかのオーバーロードコンストラクタを記述する必要が☃カスタム例外クラス
シリアル番号を提供することが望ましい☃カスタム例外のserialVersionUID
☃定義されたカスタム例外投げで投げ
☃異なる独自の命名は、例外が発生したときに知っている名前を見ることができるという意味、標準化されなければならない、あなたは名前で、例外のタイプを決定することができます
☃独自の例外クラスは、通常は、既存の例外クラスを継承する必要がありますException & RuntimeException
public class MyExceptionTest {
public void regist(int num) throws MyException {
if (num < 0)
throw new MyException("人数为负值,不合理", 3);
else
System.out.println("登记人数" + num);
}
public void manager() {
try {
regist(-1);
} catch (MyException e) {
System.out.println("登记失败," + e.getMessage());
System.out.print("出错种类" + e.getId());
}
System.out.print("本次登记操作结束");
}
public static void main(String args[]) {
MyExceptionTest t = new MyExceptionTest();
t.manager();
}
}
class MyException extends RuntimeException {
// 自定义异常序列标识号,用于区分异常
static final long serialVersionUID = 14232463463463535L;
private int idnumber;
public MyException() {}
public MyException(String message) {
super(message);
}
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}
出力:
☍概要
このブログとCSDNブログ(ཌ་。6月☠繊維་。ད)同時リリース