まず、異常
- 概要:文字通りの意味は、正常ではありません。Javaコードをコンパイルまたは実行中のプロセスに登場することは、影響を受けた場合には、結果をコンパイルまたは実行されません全ての異常です。
- 反映:種々の異常な現象を利用してClassクラスは、[、位置、タイプ、説明、およびその他の属性を異常の原因]を記載
- 使用:オブジェクト・クラスのオブジェクトは、例外クラスのオブジェクトは、異常の原因が、場所、種類、他の特定のデータの詳細な説明を発生含むスロー。
-
異常なシステム
- システム:
- Throwableを
- エラー
- 例外
- RuntimeException
- 説明:
- Throwable:例外は、すべてのトップレベルの親は、すべて共通の属性や異常行動を抽出し、
- エラー:エラー、例外が大枝に属する、プログラマは例外処理を行うことができますキャプチャしないことを意味します。例えば:メモリオーバーフロー、スタックオーバーフロー
- 例外:異常は;、我々はコードキャッチ異常処理に関連する例外オブジェクトを使用することができることを意味し、他の主要なブランチの異常です。例えば:ゼロ異常によるこのような分割としてヌル・ポインタ例外、異常
- RuntimeException:異常動作、それはこれらの異常現象が発生します実行し、問題なくコンパイルされます。例えば:ゼロ異常にヌル・ポインタ例外除算
-
例外処理
- 例外処理:我々は珍しいオブジェクトを解決するための方法であります
- 治療:マニュアルハンドリング、JVMプロセス
-
マニュアル取扱い:我々は異常なアプローチに関連するコードを所有する必要があります。
-
免責事項例外は:それは彼らが扱われていないことを例外に来たときに、すぐに対処するために他の誰かに例外宣言のタイプは[]が例外を投げるキーワードを使用すると、メソッド文の型の宣言の後に例外がスローされます
-
シーン:メソッド本体の方法は、異常事象を有していてもよいです
- フォーマット:メソッド名(パラメータリスト)が、その例外{タイプ}メソッドをスロー
- 注意:
- 異常な文が例外オブジェクトを投げ出さなければ過程で、その結果、生成されます表すものではありません、無治療ではない、文はまだあなたの文を持っている[契約上の文では、私が数え気にしませんでした]
- 出力や他の効果を慰めていなかった異常な文は、唯一の文伝える人は、[異常]異常な結果スローの[抽象]タイプの効果を捨てます
- 例外例外は、JVMによって処理されるか処理されない場合は他の誰かに投げた後の文を生成、次のコードは実行できない、例外ハンドラの他人ならば、次のコードが実行を継続します。
サンプルコード
com.ujiuye.demoパッケージ;
インポートjava.io.FileInputStream;
インポートjava.io.FileNotFoundException、
パブリック クラスDemo_Exception {
公共 静的 ボイドメイン(文字列[]引数が)にFileNotFoundExceptionをスロー {
// 構築方法を使用するときにオブジェクトを作成し、構造メソッドにFileNotFoundException例外タイプ投げる
// メソッド本体にmainメソッドを投げ、それを使用し、この異常に対処するために体を使用する必要があります
// 治療の主な方法あなたも珍しい文の使用法を捨てるを継続したくないことができ
FileInputStreamのFIS = 新しい新しい FileInputStreamを(「B.TXT \\ 」);
// 異常は、メソッド本体が異常を生成します宣言する?
//プロジェクトは、オブジェクトが異常だったというエラー手段を実行しているB.TXT \\ない場合
、// そのエラー例外オブジェクトを意味するものではありません実行しているB.TXT \\があるときに作品をなし
}
}
-
キャッチ例外処理: 異常なメソッドの本体、メソッド本体自体は、この例外オブジェクトをキャプチャするときに発生し、例外を処理するための関連コンテンツができ、スローではない人は、自分の[自分]怒らせたの災害に対処します
- フォーマット:
- 試して....キャッチ
- してみてください... catch..finally
- してみてください...ついに
-
最初のフォーマット:ください... catch
- 特定のフォーマット:試し{ 可能例外コードセグメント }キャッチ(例外型変数名){ 例外解像度コードセグメント }
- 試してみてくださいを意味してください。異常なコードを持っている可能性が実行しようとします
- キャッチ:例外が試しに発生した場合、キャプチャ手段は、例外オブジェクトがキャプチャされ、処理され、
- ():書き込みは、キャプチャに例外オブジェクトをキャッチ
- {}:ハンドル例外にコードを書きます
- 実装プロセス:
- 異常の実行、どのコードのコードは、[無効]トップダウンがcatchブロックスキップの実行中に発生しようとしません。
- コード生成の間例外を試し、例外が異常オブジェクトを発生し、コードの実行が例外ブロックの順序からジャンプするcatchブロックにトリガーキャッチャがキャッチに直接行われ、catchブロックは、コードを以下の継続完了する。
- カッコ内のキャッチワードが異常な場合、それはまた、加工ハンドル主張をキャプチャすることができます
サンプルコード
com.ujiuye.demoパッケージ;
インポートjava.io.FileInputStream;
インポートjava.io.FileNotFoundException;
パブリック クラスDemo_Exception02 {
公共の 静的な 無効メイン{(文字列[] args)を
。システムOUT .println(" 開始"); // 1
// このコード行は、災害の独自の処理を処理異常を集めている...キャッチしようと
試して{
// ファイルが異常の存在下で発生していないです
FileInputStreamのFIS = 新新のFileInputStream(「B.TXT \\ 」);
システム。OUT .println("異常な実行「;)
// ファイルが異常に存在しませんが発生していないが、コードの実行がキャッチするためにジャンプし、キャッチ例外にキャッチをここます
FileInputStreamのFIS1 = 新新のFileInputStream(」\\ B.TXT Bを" );
システム。OUT .println(「実行中の試み」); // 2は、例外なく、実行が実行はありません
} キャッチ(FileNotFoundExceptionをE) {
システム。OUTの .println(「これはファイルで、例外を見つけることができません処理されています。」) ; // 4キャッチ例外と実行
// 我々は可能宣言に対処する方法に対処する方法を捕捉することができることを除き、生成されたコードでキャッチ
試して {
FileInputStreamのFIS = 新新のFileInputStream(" A B.TXT \\ " );
} キャッチ(FileNotFoundExceptionをE1) {
システム。OUTの .println(" 例外処理" );
}
}は
。[システムOUT .printlnは(" コードが完了しました!"); // 3
}
}
- 変形形式:catchブロック形式の複数
try {有可能有异常的代码段} catch(异常对象1){解决异常1的方案} catch(异常对象2){解决异常2的方案}....catch(异常对象n){解决异常n的方案}
- 注意事项:【掌握的面试的时候经常被问到里面的相关知识点】
- 多个 catch 块,执行的时候只会执行其中之一或者一个也不执行
- 多个异常有了同时触发的条件,实际以第一个被触发的异常为准,其他的异常不会被触发,对应执行的是第一个异常的 catch 块,其他 catch 块不管【不执行】
- catch 块中不可以写 break,但是可以写 return 提前【异常处理完】结束方法
- catch 的多个异常对象之间如果有子父类关系,catch 异常对象的顺序有要求:自上而下遵循由小到大【子类类型对象在前,父类类型对象在后】
- 捕获的异常对象处理的时候选择catch块时遵循:
- 优先匹配自己类型的对象的catch块
- 没有自己类型的对象catch块,就近执行最近的父类的对象的catch块
- 自己和父类对象的catch块都没有,那就报错
- jdk1.7之后,异常捕获时异常类型可以使用|【或】表示【多种不同的异常想要用相同的处理方式的时候可以使用|】
- 多种异常类型对象,可以使用相同的处理方式
- 异常类型是相互独立没有关系的类型【不能有继承关系】
- 格式:catch(异常类型1 | 异常类型2 |异常类型3 对象名){ }
代码示例
package com.ujiuye.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class Demo_Exception03 {
public static void main(String[] args) {
System.out.println("开始执行");//1
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
//这行代码有异常 进行处理 自己惹来的祸自己处理 try...catch
try {
//文件是存在的不会发生异常 //异常1 FileNotFoundException
FileInputStream fis = new FileInputStream("a\\b.txt");
System.out.println("无异常执行");
//文件是不存在的会发生异常 catch就会到这里捕获异常,代码执行跳转到catch中
FileInputStream fis1 = new FileInputStream("b\\b.txt");
System.out.println("尝试执行过程中");//2 有异常不执行了 无异常就执行
//异常2:除数为0的异常 ArithmeticException
System.out.println(100/num);//第一个被触发了
} catch (FileNotFoundException | ArithmeticException | NullPointerException e) {
System.out.println("这是一个文件无法找到的异常,已经处理");//4 捕获异常并执行
//break;
//return ;//结束方法的
}/*catch (ArithmeticException e) {
System.out.println("这是一个文件无法找到的异常,已经处理");
//System.out.println("这是一个除数为0异常");
}*//*catch (IOException e) {//他是捕获到的异常对象的父类
System.out.println("这是一个io的异常,已经处理");//4 捕获异常并执行
}*//*catch (Exception e) {//爷爷类 执行爷爷类
System.out.println("这是一个编译异常,已经处理");//4 捕获异常并执行
}*/
System.out.println("代码执行完毕!");//3
}
}
-
第二种:try...catch...finally
- 具体格式: try {有可能产生异常代码} catch(异常对象){对异常对象的解决方案} finally {无论有无都必须要执行的代码}
- 特点:finally 里面的代码不管try 当中的代码是否会发生异常它肯定会执行的。
- 使用场景:io 流对象关闭使用 finally。
- 注意事项:
- 中间的 catch 块可以有多个
- finally 不可以单独使用,必须跟在 try 代码块后面
代码示例
package com.ujiuye.demo;
import java.io.FileInputStream;
public class Demo_Exception04 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("b\\b.txt");
//写在这没有异常可以打印输出 有异常输出不了
//System.out.println(123);
} catch (Exception e) {
System.out.println("异常已处理");
//没有异常 输出不了 有异常输出了
//System.out.println(123);
return;
}finally {
System.out.println(123);//百分百的保证代码执行
}
//必须要在控制台输出一个123
//如果catch块中产生异常或者有return 有可能输出不了
//System.out.println(123);
}
}
-
第三种处理方式【不处理异常,纯粹的为了finally】
- 格式:try { 有可能出现异常的代码 } finally { 必须要执行的代码 }
- 不怎么用;这种格式并不是处理异常的,单纯就是为了finally的使用,异常根本就没有被处理
代码示例
package com.ujiuye.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Demo_Exception05 {
public static void main(String[] args) /*throws FileNotFoundException*/ {
try {
try {
FileInputStream fis = new FileInputStream("b\\b.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//FileInputStream fis = new FileInputStream("b\\b.txt");
}/* catch (FileNotFoundException e) {
e.printStackTrace();
}*/ finally {//finally不能单独使用,必须需要try
System.out.println("nihaoha,bingdu");
}
}
}
- 处理异常使用格式注意事项:
- try 代码块可以单独使用【单独使用没有意义】变换也不能单独使用
- catch 代码块不能单独使用,不能离开 try 代码块。
- finally 不能单独使用,要结合 try 代码块使用。
二,jvm的异常处理方式
- jvm 是作为执行者,调用的 main 方法;其他方法都需要通过main方法直接或间接的调用,异常一旦产生,自己又不想自己解决采用声明的方式来抛出异常,不停抛抛来抛去最终抛到 jvm,jvm 最后的一个调用者抛不了必须要自己处理。
- jvm 的处理方式:先把程序给停止 然后捕获异常处理【把异常对象中的相关信息进行打印】。
- jvm 异常的处理和捕获处理的区别?
- 捕获处理异常:catch 块下面的代码可以继续执行出效果【jvm没有停止】
- jvm 处理异常:产生异常代码处后面的所有代码都不能够执行了【jvm直接停止】
三,异常分类
- 编译异常:在代码编译过程中会对 相关代码进行格式和语法的检查,如果不满足就会直接报错提示,不会将错误放到运行去。编译异常都属于Exception的子类,必须要进行处理才可能继续执行
- 运行异常:在编译的时候不会对代码进行一些相关的检查,只有在运行的时候才会发现有问题的异常。运行异常都是RuntimeException的子类,可以处理也可以不处理【交给jvm来处理】一般的运行异常选择不处理
四,异常体系的常用方法
- 异常体系的方法全部定义在 Throwable 类中,其他异常类没有定义任何的方法,都是继承 Throwable 中的方法。
- 构造方法:
- Throwable(): 创建一个没有任何异常信息的异常对象
- Throwable(String message): 创建一个只有异常信息描述的对象
- Throwable(Throwable t): 创建一个有异常原因的异常对象
- Throwable(String message,Throwable t): 创建一个有异常信息和异常原因的异常对象
- 普通方法:
- getCause: 获取异常对象的异常原因
- getMessage: 获取异常的提示详细信息【常用】
- toString: 获取异常对象的详细属性信息
- printStackTrace: 打印异常的调用地址信息【常用】
代码示例
package com.ujiuye.demo;
public class Demo {
public static void main(String[] args) {
Throwable t1 = new Throwable();
Throwable t2 = new Throwable("这是一个角标越界异常");
Throwable t3 = new Throwable(t2);
Throwable t4 = new Throwable("这是一个类型转换异常",t1);
System.out.println(t1.getCause());
System.out.println(t1.getMessage());
System.out.println(t1.toString());
t1.printStackTrace();
System.out.println("===============");
System.out.println(t2.getCause());
System.out.println(t2.getMessage());
System.out.println(t2.toString());
t2.printStackTrace();
System.out.println("===============");
System.out.println(t3.getCause());
System.out.println(t3.getMessage());
System.out.println(t3.toString());
t3.printStackTrace();
System.out.println("================");
System.out.println(t4.getCause());
System.out.println(t4.getMessage());
System.out.println(t4.toString());
t4.printStackTrace();
}
}