Java编程思想之通过异常处理错误

1.     异常分为被检查的异常和运行时异常,被检查的异常在编译时被强制要求检查。异常被用来错误报告和错误恢复,但很大一部分都是用作错误报告的。

2.     异常情形是由于当前环境下无法得到必要的信息导致当前方法或作用域无法继续执行。当抛出异常时,首先在堆上创建了异常对象,其次当前的执行路径中止并在当前环境中弹出对异常对象的引用,此时异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序。

3.     异常最重要的方面之一是如果发生了问题,将不允许程序沿着其正常路径继续走下去。

4.     所有标准异常类有两个构造器,一个是默认构造器,一个是接受相关信息字符串在为参数的构造器。异常类型的根类是Throwable类,错误信息可以保存在异常对象的内部或用异常类的名称来暗示。

5.     异常处理程序紧跟在try块之后,以关键字catch表示。每个catch字句是只接受一个特殊类型的参数的方法。异常处理理论有两种模型:终止模型和恢复模型。

6.     自定义异常来表示程序中可能碰到的特定问题,通过继承已有的异常类。System.err是标准错误流,不会重定向,而System.out可能会重定向。异常类调用了了在Throwable类声明的printStackTrace()方法,将打印“从异常抛出处到方法调用处”的方法调用序列。

7.     Java.util.logging工具将输出记录到日志中去。显示日志的方法是调用与日志记录消息级别相关的方法severe()。记录其他人编写的异常并生成日志的方法不同点:e.printStackTrace();

8.     异常说明数据方法声明的一部分,紧跟在形参之后。其使用了throws复数关键字,后面接一个异常类型构成的列表。代码必须与异常说明一致。如果代码产生了异常,要么处理这个异常,要么在异常说明中表明此方法将产生异常。

9.     可以声明方法将抛出异常,实际上却不抛出。这样就为异常先占了位子,以后就可以抛出这种异常而不用修改已有的代码,主要用在定义抽象基类和接口时。

10.  使用基类Exception可以捕获所有异常。

11.  把刚捕获的异常重新抛出,异常对象的所有信息都得以保持。也可以捕获异常后抛出另外一种异常。

12.  异常链:捕获异常后抛出另外一种异常,并保存原始异常的信息。三种基本的异常类带有带cause参数(表示原始异常)的构造器,是Error,Exception和RuntimeException。两种方式:1. 带cause参数(表示原始异常)的构造器,2.没有此构造器的异常类型,通过initCause()方法来把异常链接起来。

13.  属于运行时异常的类型有很多,它们自动被Java虚拟机抛出,所以不必在异常说明中列出来,称为不受检查的异常,代表编程错误,将被自动捕获。但尽管通常不用捕获RuntimeException异常,但还是可以在代码中抛出RuntimeException类型的异常。如果RuntimeException类型的异常没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrace()方法。

14.  当要把除内存之外的资源恢复到它们的初始状态时,就要用到finally子句。异常没被当前处理程序捕获,但会运行finally字句。甚至在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finally子句。当涉及continue和break语句时,也会执行finally子句。当涉及return时,先执行finally子句,再执行return。

15.  异常忽略丢失:try块中抛出的异常被finally子句抛出的异常所取代,被catch语句捕获到。如果直接在try-finally语句的finally字句中执行return,try块抛出的异常也会被忽略。

16.  当覆盖方法时,只能抛出在基类方法的异常说明里列出的那些异常(及子类)。但是异常限制对构造器不起作用,子类的构造器可以不必理会基类构造器所抛出的异常。子类的构造器的异常声明必须包含基类构造器的异常声明。派生类的构造器不能捕获基类构造器抛出的异常。强制派生类遵守基类方法的异常声明。派生类可以不抛出任何异常,即使它是基类所定义的异常。因为异常说明本身不属于方法类型的一部分,因此不能基于异常说明来重载方法。一个出现在基类方法的异常说明的异常,不一定会出现在派生类方法的异常说明里。

17.  如果在构造器内抛出了异常,清理方法也许不能正常工作。对于创建对象的语句置于外部的try块中,如果构造失败,将进入外部的catch字句。如果构造成功,则确定对象能被清理,因此在构造之后,进入内部的try-catch-finally或try -finally块,finally字句执行清理工作。基本原则是:在创建需要清理的对象之后,立刻进入try -finally块。对于一群不能失败的构造器的对象来说,从构造和清理出发,可以群组在一起。当对于那些具有可以失败的构造器对象来说,得嵌套。

18.  异常匹配:抛出异常时,异常处理系统会按照代码的书写顺序找到最近的处理程序,找到后,就默认异常会被处理,即使异常没有被捕获,然后就不会在继续查找了。

19.  被检查的异常强制你在没有准备好处理错误时候被迫加入catch字句,导致吞下异常。解决方法:1. 通过给main方法throwsException来把异常传递给控制台。2. 可以把被检查的异常包装在RuntimeException里面,再throw出来,保证了既不需要写try-catch块,因为没有抛出被检查的异常,也包装了不会丢失任何原始异常的信息。但是如果准备捕获异常的时候,还是可以用try块来捕获你想要的异常。

20.  与恢复功能相比,报告功能才是异常的精髓所在。Java坚定强调将所有的错误都以异常的形式报告这一事实。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值