Java-异常处理

异常机制

Java的异常机制主要依赖于try,catch,finally,throw,throws五个关键字,可以让程序具有极好的健壮性。

1,try catch捕获异常

try{
    //业务实现代码
}
catch (Exception e){
    System.out.println("输入不合法");
    goto retry
}

如果业务代码块出现异常,系统会生成一个异常对象,这个过程称为抛出异常。
2,异常类的继承机制
每个catch块都是专门用于处理该异常类及其子类的异常实例。

try块后面可以有多个catch块,java运行时可以根据该异常对象所属的异常类来决定使用哪个catch块来处理该异常。

JAVA把所有非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
Error:一般是与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等。这种错误无法恢复或不可能捕获。
Exception:`

try {
            Date d = null;
            //业务实现代码
            System.out.println(d.after(new java.util.Date()));
        } catch (NullPointerException ne) {
            System.out.println("空指针异常");
        } catch (Exception e) {
            System.out.println("未知异常");

        }

可以看到Exception类的catch块应当放在最后,也就是先处理小异常,再处理大异常

3,JAVA7新增的多异常捕获
注意:

捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。
捕获多种类型的异常时,异常变量默认有隐式的final修饰,因此程序不能对异常变量重新赋值。

4,访问异常信息

getMessage():返回该异常描述的详细字符串
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流
getStackTrace():返回该异常的跟踪栈信息

5,使用finally回收资源

对数据库连接,网络连接,磁盘文件等物理资源进行回收。

try{
    //业务实现代码
}
catch (Exception e){
    //异常代码块
}
catch (Exception e){
    //异常代码块
}
finally{
    //资源回收块
}

1,如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,则finally块将失去执行的机会。
2,尽量避免使用return或throw等导致方法终止的语句,否则可能会出现一些奇怪的情况

6,Java9增强的自动关闭资源的try语句

try(
//声明,初始化两个可关闭的资源
//try语句会自动关闭这两个资源
BufferedReader br= new BufferedReader(new FileReader("AutoCloseTest.java"))
)

这种try语句相当于包含了隐式的finally块

异常体系

Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)
Java程序必须显式处理Checked异常。

1,使用throws声明抛出异常

当不知道如何处理这种类型的异常时,该异常应该由上一级调用这处理

throws ExceptionClass1 , ExceptionClass2...

一旦使用throws语句,就无需再使用try…catch块来捕获该异常

方法重写时,子类抛出的异常应该是父类抛出异常类型的子类或相同

2,使用throw抛出异常
如果需要自行抛出异常,则应使用throw语句

throw ExceptionInstance;

当Java运行时接收到自行抛出的异常后,同样会中止执行流,跳到catch里进行处理。

3,自定义异常类
下面是自定义异常类的一个例子

public class MyException extends Exception {
    //无参构造器
    public MyException(){}
    //有参构造器
    public MyException(String Msg){
        super(Msg);
    }
}

4,catch和throw同时使用
当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可以完全处理该异常。也就是说,在异常出现的当前方法中,程序只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成。

5,异常链
程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常包含了对用户的提示信息,这种处理方式被称为异常转译。
这种把捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来是一种典型的链式处理,称为“异常链”。

23种设计模式之一:职责链模式

异常处理的规则和总结

1,不要过度使用异常
2,不要使用过于庞大的try块
3,不要忽略捕获到的异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值