04、关于异常处理机制的使用,我这里总结了一些非常实用的建议,希望你能够采纳。
1)尽量捕获原始的异常。
实际应该捕获 FileNotFoundException
,却捕获了泛化的 Exception
。示例如下。
这样做的坏处显而易见:假如你喊“王二”,那么我就敢答应;假如你喊“老王”,那么我还真不敢答应,万一你喊的我妹妹“王三”呢?
很多初学者误以为捕获泛化的 Exception
更省事,但也更容易让人“丈二和尚摸不着头脑”。相反,捕获原始的异常能够让协作者更轻松地辨识异常类型,更容易找出问题的根源。
2)尽量不要打印堆栈后再抛出异常
当异常发生时打印它,然后重新抛出它,以便调用者能够适当地处理它。就像下面这段代码一样。
这似乎考虑得很周全,但是这样做的坏处是调用者可能也打印了异常,重复的打印信息会增添排查问题的难度。
3)千万不要用异常处理机制代替判断
我曾见过类似下面这样奇葩的代码,本来应该判 null
的,结果使用了异常处理机制来代替。
捕获异常相对判断花费的时间要多得多!我们可以模拟两个代码片段来对比一下。
代码片段 A:
代码片段 B:
100000 万次的循环,代码片段 A(异常处理机制)执行的时间大概需要 1983 毫秒;代码片段 B(正常判断)执行的时间大概只需要 1 毫秒。这样的比较虽然不够精确,但足以说明问题。
4)不要盲目地过早捕获异常
如果盲目地过早捕获异常的话,通常会导致更严重的错误和其他异常。请看下面的例子。
假如文件没有找到的话,InputStream
的对象引用 is 就为 null
,新的 NullPointerException
就会出现。
NullPointerException
并不是程序出现问题的本因,但实际上它出现了,无形当中干扰了我们的视线。
正确的做法是延迟捕获异常,让程序在第一个异常捕获后就终止执行。
05、好了,关于异常我们就说到这。
异常处理是程序开发中必不可少的操作之一,但如何正确优雅地对异常进行处理却是一门学问,好的异常处理机制可以确保程序的健壮性,提高系统的可用率。