Java异常处理
一,异常的概念
1,异常(exception)是在运行过程中代码序列中产生的一种例外情况。
2,Exception类的层次
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
二,常见的异常类型
三,异常处理
Java异常处理通过5个关键字控制:try、catch、 throw、throws和 finally。
1,try-catch结构
try{
代码A
代码B
}catch(ExceptionType e){
异常处理代码C
}
代码D
期望:A—>B—>C—>D 程序无异常时
实际:A—>异常处理—>C—>D 代码B出现异常时
实际:A—>B—>异常处理—>C—>D 代码B出现异常时
2,finally关键字
有些时候,try块内引用了一些物理资源,例如数据库连接、网络连接或磁盘文件等,那么一旦try块内出现异常,这些资源将无法保证被释放
必须要有一种很确切的办法办法确保资源一定得到释放,而不管是否存在异常,这就是finally存在的原因。
ry{
代码A
代码B
}catch(ExceptionType e){
异常处理代码C
}finally{
回收代码资源代码D
}
代码E
注意下面事项:
catch 不能独立于 try 存在。
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try, catch, finally 块之间不能添加任何代码。
代码展示:
package exception;
public class ArithmeticException {
public static void main(String[] args) {
//算数错误
try {
int num=5/0; //出现异常
System.out.println(num); // 异常后的程序不再执行
}catch (java.lang.ArithmeticException e){ //捕捉异常
System.out.println("除数不能为零"); //处理异常
}finally {
System.out.println("资源回收"); //资源回收
}
System.out.println("helloworld"); //后面的程序继续执行
//试图访问null对象引用
try {
String str = null; //定义一个空的字符串
System.out.println(str.length()); //输出空字符串长度,出现异常
}catch (NullPointerException c){ //捕捉异常
c.printStackTrace(); //打印异常
System.out.println("不能为空"); //处理异常
}finally {
System.out.println("回收资源"); //回收资源
}
System.out.println("程序继续执行"); //后面的程序继续执行
}
}
运行结果:
3,多重catch块
try{
代码A
try {
代码A1
代码B1
代码C1
}catch(ExceptionType2 e2){
异常处理代码D2
}
代码C
}catch(ExceptionType2 e2){
异常处理代码D1
}finally{
回收资源代码E
}
代码F
上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
代码展示:
package exception;
import java.lang.ArithmeticException;
public class MultiplAanomalies {
public static void main(String[] args) {
try {
int i=5/1; //语句正确,正常执行
System.out.println(i);
try {
int num = 5/0; //出现异常
System.out.println(num); //异常语句后面的代码不再执行
String str = null;
System.out.println(str.length());
}catch (ArithmeticException c){ //捕捉异常
System.out.println("出现异常啦");
}catch (NullPointerException c){
System.out.println("出现异常");
}
}catch (Exception c){
System.out.println("出现异常了");
}finally {
System.out.println("资源回收");
}
System.out.println("程序继续执行");
}
}
运行结果:
3,throw和throws关键字
(1),throw关键字
有时需要明确的引发一个异常,Java语言可以用 throw语句显式地引发异常。
执行流程一旦遭遇throw语句,就会立即停止,不会再执行下一个语句。
简单来说就是自定义一个异常
(2),throws关键字
throws跟在方法之后,说明该方法可能会抛出某个或某些异常,而这个方法并不关心或不方便处理,由方法的调用者来处理这些异常。
代码展示:
package Throw;
//自定义异常类,继承Exception类
public class MyExcertion extends Exception{
public MyExcertion(){ //无参构造方法
super();
}
public MyExcertion(String a){ //有参构造方法
super(a);
}
}
package Throw;
public class Test1 {
public static void main(String[] args) {
try {
show();
} catch (MyExcertion myExcertion) {
myExcertion.printStackTrace(); //打印异常
System.out.println("出现异常");
}
}
public static void show() throws MyExcertion{
if (2>1){ //自定义异常,比如去银行取钱,取款金额大于卡内余额则会显示余额不足(相当于出现异常)。
throw new MyExcertion();
}
}
}
运行结果:
四,异常使用规则
不要为每个可能会出现异常的语句都设置try和catch。虽 然使用异常可以分离常规代码和错误处理代码,从而提高 代码的可读性,但是,异常的不恰当使用会降低代码的可 读性。
避免总是catch Exception或Throwable,而要catch具 体的异常类。这样可以使程序更加清晰。
什么情况下使用异常?如果方法遇到一个不知道如何处理 的意外情况(abnormal condition),那么它应该抛出 异常。
不要在循环中使用try…catch,尽量将try…catch放在循 环外或者避免使用。
异常处理不应用来控制程序的正常流程,不要将异常看作 是“super if