Tips
书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code
注意,书中的有些代码里方法是基于Java 9 API中的,因此JDK 最好下载 JDK 9以上的版本。java
虽然这一建议彷佛显而易见,但它常常被违反,所以值得重复说起。当API的设计人员声明一个抛出异常的方法时,他们试图告诉你一些事情。不要忽忽略它!在方法调用的周围加上一条try语句,其catch块为空,这样就很容易忽略了异常:git
// Empty catch block ignores exception - Highly suspect! try { ... } catch (SomeException e) { }
空的catch块违背了异常的初衷,而异常的目的是强迫处理异常状况。忽略异常相似于忽略火灾警报——关掉它,这样其余人就没有机会看到是否真的发生了火灾。你可能侥幸逃脱,或者结果多是灾难性的。每当你看到一个空的catch块,你的脑海中就应该响起警报。github
但在某些状况下,忽略异常是合适的。例如,在关闭FileInputStream时,它多是合适的。你没有更改文件的状态,所以不须要执行任何恢复操做,而且已经从文件中读取了所需的信息,所以没有理由停止正在进行的操做。记录异常多是明智的,这样若是这些异常常常发生,你就能够调查这个问题。若是选择忽略异常,catch块应该包含一条解释为何这样作是合适的注释,而且变量应该被命名为ignore:编程
Future<Integer> f = exec.submit(planarMap::chromaticNumber); int numColors = 4; // Default; guaranteed sufficient for any map try { numColors = f.get(1L, TimeUnit.SECONDS); } catch (TimeoutException | ExecutionException ignored) { // Use default: minimal coloring is desirable, not required }
本条目中的建议一样适用于检查异常和未检查异常。无论异常是表示可预测的异常状况仍是编程错误,用空catch块忽略它将致使程序在错误面前默默地执行下去。而后,程序可能会在将来的任意时间失败,在代码中与问题根源没有明显关系的某个点上。正确处理异常能够彻底避免失败。仅仅让异常向外传播至少会致使程序迅速失败,保留信息以帮助调试失败的缘由。ui