java编程思想 第十二章 通过异常处理错误

来源:互联网 发布:手机怎么成为网络歌手 编辑:程序博客网 时间:2024/06/11 10:44

1.异常处理是java中唯一正式的错误报告机制,并且通过编译器强制执行

2.异常情形:指阻止当前方法或作用域继续执行的问题。能做的就是从当前的环境中跳出,把问题提交给上一级环境,这就是抛出异常时所发生的事情。

3.抛出异常的时候:

1. 同java中其他对象的创建一样,将使用new在堆上创建异常对象2. 当前的执行路径被终止,并且从当前环境中弹出异常对象的引用。之后异常处理机制接管程序,并开始寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序(任务:将程序从错误状态中恢复,以使程序能要么换一种方式执行,要么继续运行下去;以关键字catch表示,只有匹配的catch子句才能得到执行)

4. 标准异常类都有两个构造器

1. 默认构造器2. 接受字符串作为参数,以便能够把相关信息放入异常对象的构造器

5. throw能够任意类型的Throwable对象,Throwable是异常类型的根类

6. 异常处理机制:可以把所有动作都放在try块里,然后只需在一个地方就可以捕获所有异常。

7. 异常处理理论:

1. 终止模型——java支持,一旦异常被抛出,就表明错误已经无法挽回,也不能回来继续执行2. 恢复模型    1. 异常处理程序的工作就是修正错误,然后重新尝试调用出问题的方法,并认为第二次能成功。    2. 再遇见错误的时候就不能抛出异常,而是调用方法来修正该错误。    3. 或者,把try块放在while循环里,这样就不断的进入try块,直到得到满意的结果。

8. 创建自定义异常——必须从已有的异常类继承,做好是选择意思相近的异常类继承

1. 建立新的异常类型最简单的方法是让编译器为你产生默认构造器2. 对异常来说,最重要的部分就是类名

9. Exception.printStackTrace():将打印“从方法调用处直到异常抛出处”的方法调用序列,发送到System.out;使用它来打印异常信息

10. 异常与记录日志

1. 静态的Logger.getLogger()方法创建一个String参数相关联的Logger对象(通常与错误相关的包名和类名),这个Logger对象会将其输出发送到System.error2. 向Logger写入的最简单方式是:直接调用与日志记录消息的级别相关联的方法,如:server()3. 如果将java.io.StringWriter对象传递给PrintWriter的构建器,通过调用toString()方法,就可以将输出抽取成为一个String

11. 异常说明:使用throws关键字,后面接一个所有潜在异常类型的列表

1. 可以声明将抛出异常,实际上却不抛出,这在定义抽象基类和接口的时候很重要,这样派生类或者接口实现能够抛出这些预先声明的异常2. 两种意思:    1. 我的代码会产生这种异常,这由你来处理    2. 我的代码忽略了这些异常,这由你来处理

12. 被检查的异常:在编译时被强制检查的异常

13. fillInStackTrace():用于在Throwable对象的内部记录栈帧的当前状态,返回一个Throwable对象

14. 重新抛出异常

1. 把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch子句将被忽略,高一级环境中捕获次异常的处理程序可以从这个异常对象中得到所有信息2. 如果只是抛出当前异常对象,printStackTrace()显示的将是原来异常抛出点的调用栈信息;调用fillInStackTrace()方法可以更新这个信息(调用fillInStackTrace()的那一行就成为了异常的新发生地)

15. 异常链:想要在捕获一个异常后抛出另一个异常,并且把原始异常的信息保存下来(P260)

16. Throwable对象可分为两种类型:Error和Exception

17. RuntimeException异常——不受检查异常,这种异常属于错误,被自动捕获,不用程序员处理;如果不被捕获,那么在程序退出前将调用异常的printStackTrace()

18. 当java中的异常不允许我们回到异常抛出的地点时,那么如何处理呢?

1. 把try块放在循环里,就确立了一个“程序继续执行之前必须要达到”的条件2. 加入一个static类型的计数器或者别的装置,使循环在放弃以前尝试一定的次数

19. finally子句

1. 它能使程序员保证:无论try块里发生什么,内存总能得到释放。2. 当涉及到break和continue语句的时候,finally子句也会被执行

20. 异常丢失:前一个异常还没处理就抛出下一个异常

21. 派生类构造器不能捕获基类构造器抛出的异常;在继承中重写方法时候访问权限不能缩小,但是异常说明的接口恰恰相反,只能缩小

22. 构造器(P272)

1. 对于构造阶段可能会抛出异常,并且要求清理的类,最安全的使用方式是使用嵌套的try子句2. 清理惯用法在构造器不抛出异常的时候也该运用,基本规则:在创建需要清理的对象之后,立即进入一个try-finally语句块3. 对于每一个构造,都必须包含在其自己的try-finally语句块中,并且每一个对象构造器必须都跟随一个try-finally语句块以确保清理

23. 异常匹配

1. 抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序。找到匹配的处理程序后,就认为异常将得到处理,然后就不再继续查找2. 派生类的对象也可以匹配其基类的处理程序

24. 其他可选方式

1. 异常处理的一个重要原则:只有在你知道如何处理的情况下才捕获异常2. ”被检查异常”——强制你在可能还没准备好处理错误的时候被迫加上catch子句,导致“吞食则有害”    1. 给main()加上异常说明,通过把它传递到控制台,就不必再main()里写try-catch子句了    2. 把“被检查的异常”转换为“不检查的异常”        1. 大型项目中避免起初不知道如何处理“被检查的异常”时使用        2. 即把“被检查的异常”包装进RuntimeException里面            3. throw new RuntimeException(e);        4. 当你需要对其中的异常进行处理的时候,可以通过getCause()捕获并处理特定的异常                try{                    throw RuntimeException.getCause();                }catch(){                }

25. 异常使用指南:

 1. 在知道该如何处理的情况下才捕获异常 2. 解决问题并且重新调用产生异常的方法 3. 进行少许修补,然后绕过异常发生的地方继续执行 4. 用别的数据进行计算,以代替方法预计会返回的值 5. 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛给更高层 6. 把当前运行环境下能做的事情尽量做完,然后把不同的异常重抛给更高层 7. 终止程序 8. 进行简化 9. 让类库和程序更安全

26“报告”功能是异常的精髓所在。java坚定的强调所有的错误都以异常形式报告的这一事实。

1 0
原创粉丝点击