在学习《异常处理》这章的时候,寝室的问我这样的问题:用以前的判断语句也可以异常,为什么需要异常处理?似乎这章的内容是无用的。我当时学的不深所以没法回答这个问题。
今天再回顾这章知识,觉得是很有必要的。
回答之前的问题:
判断语句当然可以捕捉程序中的异常,但需要大量的判断语句,并且不能捕捉所有错误,而且还会导致程序的运 行效率降低。
而Java的异常处理机制为复杂的程序提供了强有力的控制方式:易于使用、可自行定义异常类,处理异常时不会降低程序运行效率。同时这些处理异常的代码与”常规“代码的分享,增强了程序的可读性。
面试问题:
1、异常类Throwable的继承结构
Excption
Error表示JVM错误,应用程序对此无能为力,开发时不予关注。
eg:
(1).OutOfMemoryError代表JVM的堆空间耗尽
(2).UnknowError代表Java虚拟机中出现一个未知但严重的异常。
2、Java的异常处理机制
答:我把这过程比作”警察处理犯错的罪犯“(或处理女朋友发脾气)
(1)一旦产生异常,则首先会产生一个异常类的实例化对象(这是犯错后产生罪犯)
(2)在try语句中对此异常对象进行”审问“(警察审问过程)
(3)产生异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码。(根据相应法律执行制裁)
3、异常捕获和处理策略
捕获:
- 从方法的使用者角度声明对使用者有意义的异常
- 何时抛出异常--在所设计的方法遇到不能处理的非正常情形下,应当声明抛出异常。
- 声明抛出”超级异常“对方法使用者是毫无用处的,而且会导致极差的代码风格。
- 一般不声明超过3个的异常。
- 不声明所有可能的异常,要尽可能的将“低级异常”映射成“高级异常”。
处理:
- 尽可能只捕获指定的异常,而不是捕获多个异常的公共父类,除非确信这个异常的所有子类对程序是没有差别的。
- 重构代码时,仔细观察因为代码的改变而变得多余的catch子句。
4、可不可以直接使用Throwable?
答:不建议使用的,最大只能捕获Exception(Error本身不需要程序处理).当然在代码上是没有任何问题的。
5、throw 和 throws关键字的区别
答:
throws用在方法声明处,表示本方法不处理异常,但要上报,调用时必须进行异常处理。
throw表示在方法中手工抛出一个异常
6、Exception类与RuntimeException类(运行时异常)的区别
Exception在程序中必须使用try……catch进行处理
RuntimeException可能在任何正常的操作中被抛出,可以不使用try……catch进行,但是如果有异常产生将由JVM进行处理,会导致程序中断执行。
你能举例么?eg:
(1).NullPointerException表示试图引用null对象的方法或属性
(2).IndexOutOfBoundException表示数组越界的异常。在C语言中是不会出现的特性,往往会造成严重的难以发现的漏洞。
注意点:
1、Java中所有捕获范围不的异常必须放在捕获范围大的异常之前,否则程序在编译时会出现错误提示。
2、掌握throw和throws的应用代码结构形式
3、自定义异常类只需要继承Exception类
4、断言assert可以用来检测程序的执行结果,但在开发中不提倡使用断言进行检测
5、Java 7中异常捕获的新特性: 多重捕捉(Mlti-catch) 更精确判断重抛(More-precise-rethrow)
----世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默承受,静静处理。到那时,再来期待我们的finally。