《java语言程序设计》第十二章学习总结

异常类型
    异常的根基是java.lang.Throwable 。所有的java异常类都直接或者间接地继承自Throwable。可以通过继承Exception或者Exception的子类来创建自己的异常类。

    这些异常类可以分为三种主要类型:系统错误,异常和运行时异常。

    系统错误(system error)是由java虚拟机抛出的,用Error类表示。Error类描述的是内部系统错误。这样的错误很少发生。如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。

    异常(exception)是用Exception类表示的,它描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。

    运行时异常(runtime exception)是用RuntimeException类表示的,它描述的是程序设计错误。

    RuntimeException,Error以及它们的子类都称为免检异常。所有其他异常都称为必检异常。
java异常处理的三种操作
    每个方法都必须声明它可能抛出的必检异常的类型,这称为声明异常。
    关键字是throws。
    public void myMethod() throws Exception1,Exception2

    检测到错误的程序可以创造一个合适的异常类型的实例并抛出它,这就称为抛出一个异常。
    关键字是throw。

    当抛出一个异常时,可以在try-catch块中捕获和处理它
    try{
        statements;
    }catch(Exception exVar1) {
        handler for exception1;
    }
    如果在执行try块的过程中没有出现异常,则跳过catch子句。

    如果try块中的某条语句抛出一个异常,java就会跳过try块中剩余的语句,然后开始查找处理这个异常的代码的过程。处理这个异常的代码称为异常处理器;可以从当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到这个处理器。从第一个到最后一个逐个检查catch块,判断在catch块中的异常实例是否是该异常对象的类型。如果是,就将该异常对象赋值给所声明的变量,然后执行catch块中的代码。如果没有发现异常处理器,java会退出这个方法,把异常传递给调用这个方法的方法,继续同样的过程来查找处理器。如果在调用的方法链中找不到处理器,程序就会终止并且在控制台上打印出错信息。寻找处理器的过程称为捕获一个异常。

    从一个通用的父类可以派生出各种异常类。如果一个catch块可以捕获一个父类的异常对象,他就能捕获那个夫类的所有子类的异常对象。

    在catch块中异常被指定的顺序是非常重要的。如果父亲的catch块出现在子类的catch块之前,就会导致编译错误。

    java强迫程序员处理必检异常。如果方法声明了一个必检异常(即Error或RuntimeException之外的异常),就必须在try-catch块中调用它,或者在调用方法中声明要抛出异常。

    对于使用同样的处理代码处理多个异常的情况,可以使用新的JDK7的多捕获特征简化异常的代码缩写。
    catch(Exception1|Exception2|Exception){
        //Same code for handling these exceptions
    }

    异常对象包含关于异常的有价值的信息。可以使用printStackTrace(),getMessage(),toString(),getStackTrace()方法从异常对象获取信息。
finally子句
    在任何情况下,finally块中的代码都会执行,不论try块中是否出现异常或者是否被捕获。考虑下面三种可能出现的情况:
    如果try块中没有出现异常,执行finalStatements,然后执行try语句的下一条语句。
    如果try块中有一条语句引起异常,并被catch块捕获,然后跳过try块的其他语句,执行catch块和finally子句。执行try语句之后的下一条语句。
    如果try块中有一条语句引起异常,但是没有被任何catch块捕获,就会跳过try块中的其他语句,执行finally子句,并且将异常传递给这个方法的调用者。即使在到达finally块之前有一个return语句,finally块还是会执行。
重新抛出异常
    如果异常处理器不能处理一个异常,或者只是简单地希望它的调用者注意到该异常,Java允许该异常处理器重新抛出异常。
    try{
        statements;
    } catch (Exception ex) {
        perform operations before exits;
        throw ex;
    }
链式异常
    有时候,可能需要同原始异常一起抛出一个新异常,这称为链式异常。
    throw new Exception("New info from method1",ex);
    throw new Exception("New info from method2");
自定义异常类
    如果遇到一个不能用欲定义异常类恰当描述的问题,那就可以通过派生Exception类或其子类,例如,IOException,来创建自己的异常类。
io.File类 util.Scanner类

参考链接

小提示
1.在代码中,应该什么时候使用try-catch块呢?当必须处理不可预料的错误状况时应该使用它。不要用try-catch块处理简单的可预料的情况。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值