- 异常主要分为:
- 检查型异常:编译器将检查我们的方法是否只抛出了它们声明自己会抛出的异常;虽然这种情况是异常的,但是一定程度上它的发生是可以预计的,而且一旦这种情况确实发生了,就必须以某种方式来处理;
- 非检查型异常:标准运行时异常(runtime exception)和错误(error)扩展了RuntimeException或者Error;大体上说,它反应了我们的程序逻辑中的错误,而且不能在运行时得到恢复;例如数组越界,内存溢出;这些错误应该在程序代码中纠正,因为我们编写的任何语句都可能会出错,所以必须声明或捕获由这些错误所导致的所有异常是完全不现实的;
- 方法可以抛出的检查型异常是用throws子句来声明的,它声明了一个用逗号分隔的异常类型列表。只有那些没有在方法体内部被捕获的异常才必须列出来;
- 一个方法没有throws子句并不意味着它不能抛出任何异常:这仅仅意味着不能抛出检查型异常;
- 如果我们调用了在其throws子句中列出了检查型异常的方法,那么我们有三种选择:
- 捕获这个异常并处理它;
- 捕获这个异常,并通过抛出在我们自己的throws子句中声明的异常类型来把它映射为我们自己的异常;
- 在我们的throws子句中声明这个异常,并且让该异常穿过我们的方法;
- 用其他异常来代替原有异常是很重要的一种提高抽象层次的方式;
- 不论是通过构造器还是调用一次initCause方法,一个异常只能设置一次它的原因,任何对重新设置它的尝试都将导致抛出IllegalstateException异常;
- 栈轨迹是用StackTraceElement对象数组来表示的,我们可以用getStackTrace方法得到这个数组,我们可以使用这个数组来检查栈或者建立我们自己的信息显示方式。每个StackTraceElement对象都表示一个调用栈中的方法调用;我们可以用getFilName、getClassName、getMethodName、getLineNumber或isNativeMethod方法来查询它们;
- 判定什么情况属于预料之中而什么情况属于预料之外是一个很模糊的问题,关键是不要把异常滥用为报告可预料情况的方式;
- 断言的典型应用是确保在发生了“不能发生的”事情时可以引起人们的注意,这就是为什么失败的断言会抛出Error而不是Exception的原因;失败的断言意味着当前的状态基本上是混乱的;所以断言应该用来测试从来都不会发生的情况;
- 事实上,断言是一种检验代码中有没有缺陷或意外用法的方式,而不是检查调用它的代码有没有缺陷的方式,所以不要用断言来验证传给非私有方法的引元;
- 对于有返回值的方法来说,使用throw将会特别有用,如果没有throw,编译器会执意要求我们在末尾返回一个数值;
The Java Programming Language4th读书笔记-第十二章 异常与断言
最新推荐文章于 2022-01-27 14:24:48 发布