Java异常:选择Checked Exception还是Unchecked Exception

上传人:野鹰 文档编号:3037666 上传时间:2017-07-30 格式:PDF 页数:9 大小:414.78KB
返回 下载 相关 举报
Java异常:选择Checked Exception还是Unchecked Exception_第1页
第1页 / 共9页
Java异常:选择Checked Exception还是Unchecked Exception_第2页
第2页 / 共9页
Java异常:选择Checked Exception还是Unchecked Exception_第3页
第3页 / 共9页
Java异常:选择Checked Exception还是Unchecked Exception_第4页
第4页 / 共9页
Java异常:选择Checked Exception还是Unchecked Exception_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Java异常:选择Checked Exception还是Unchecked Exception》由会员分享,可在线阅读,更多相关《Java异常:选择Checked Exception还是Unchecked Exception(9页珍藏版)》请在金锄头文库上搜索。

1、选择 Checked Exception 还是 Unchecked Exception? By Jakob Jenkov Java 包含两种异常: checked 异常 和 unchecked 异常 。 C#只有 unchecked 异常。 checked 和 unchecked 异常之间的区别是: 1. Checked 异常必须被显式地捕获或者传递,如 Basic try-catch-finally Exception Handling 一文中所说。而unchecked 异常则可以不必捕获或抛出。 2. Checked 异常继承 java.lang.Exception 类。 Unchecke

2、d 异常继承自 java.lang.RuntimeException 类。 有许多支持或者反对二者甚至是否应该使用 checked 异常的争论。本文将讨论一些常见的观点。开始之前,先 澄清一个问题: Checked 和 unchecked 异常从功能的角度来讲是等价的。可以用 checked 异常实现的功能必然也可以用 unchecked 异常实现,反之亦然。 选择 checked 异常还是 unchecked 异常是个人习惯或者组织规定问题。并不存在谁比谁强大的问题。 一个简单的例子 在讨论 checked 和 unchecked 异常的优缺点前先看一下代码中如下使用它们。下面是一个抛出 c

3、hecked 异常的方法,另一个方法调用了它: java view plaincopyprint? 1. public void storeDataFromUrl(String url) 2. try 3. String data = readDataFromUrl(url); 4. catch (BadUrlException e) 5. e.printStackTrace(); 6. 7. 8. 9. public String readDataFromUrl(String url) 10. throws BadUrlException 11. if(isUrlBad(url) 12. t

4、hrow new BadUrlException(Bad URL: + url); 13. 14. 15. String data = null; 16. /read lots of data over HTTP and return 17. /it as a String instance. 18. 19. return data; 20. readDataFromUrl()方法抛出了 BadUrlException。 BadUrlException 是我自己实现的一个类。由于 BadUrlException 继承自 java.lang.Exception,因而它是 checked 异常:

5、java view plaincopyprint? 1. public class BadUrlException extends Exception 2. public BadUrlException(String s) 3. super(s); 4. 5. 如果 storeDataFromUrl()方法想要调用 readDataFromUrl(),它只有两种选择。要么捕获 BadUrlException,要么沿着调用栈继续向上传播该异常。上面的代码中 storeDataFromUrl() 捕获了异常。向上传播异常的实现方法如下: java view plaincopyprint? 1. p

6、ublic void storeDataFromUrl(String url) 2. throws BadUrlException 3. String data = readDataFromUrl(url); 4. 可以看到,上述代码去掉了 catch 块,方法声明中加上了 throws BadUrlException。下面,讨论一下 unchecked 异常的实现方法。首先,将 BadUrlException 改为继承自 java.lang.RuntimeException: java view plaincopyprint? 1. public class BadUrlException

7、extends RuntimeException 2. public BadUrlException(String s) 3. super(s); 4. 5. 然后,把方法中的异常改为 unchecked BadUrlException: java view plaincopyprint? 1. public void storeDataFromUrl(String url) 2. String data = readDataFromUrl(url); 3. 4. 5. public String readDataFromUrl(String url) 6. if(isUrlBad(url)

8、7. throw new BadUrlException(Bad URL: + url); 8. 9. 10. String data = null; 11. /read lots of data over HTTP and 12. /return it as a String instance. 13. 14. return data; 15. 注意, readDataFromUrl()方法不再声明抛出 BadUrlException。 storeDataFromUrl()方法也不必捕获 BadUrlException。storeDataFromUrl()也可以捕获异常,但不再是必须的了,而

9、且它也不必声明传播异常。 Checked 还是 Unchecked? 上一节我们已经讨论了 checked 异常和 unchecked 异常代码实现上的区别,下面深入分析二者的适用情况(支持和反对二者的观点)。 一些 Java 书籍(如 Suns Java Tutorial)中建议 在遇到可恢复的错误时采用 checked 异常,遇到不可恢复的异常时采用unchecked 异常。事实上,大多数应用必须从几乎所有异常(包括 NullPointerException, IllegalArgumentException 和许多其他 unchecked异常)中恢复。执行失败的 action/trans

10、action会被取消,但是应用程序必须能继续处理后续的 action或 transaction。关闭一个应用的唯一合法时机是应用程序启动时。例如,如果配置文件丢失而且应用程序依赖于它,那么这时关闭应用程序是合法的。 我建议的使用策略是:选择 checked 异常或 unchecked 异常中的一种使用。混合使用经常导致混乱和不一致。如果你是一个经验丰富的程序员,那么根据自己的需要使用吧。 下面是支持和反对 checked/unchecked 异常的一些最常见的观点。支持一种类型的 exception 的观点通常意味着反对另一种(支持 checked = 反对 unchecked,支持 unch

11、ecked = 反对 checked)。因此,只列出了支持 checked 异常或unchecked 异常的列表。 1. 支持 Checked 异常: 编译器强制检查, checked 异常必须被捕获或者传播,这样就不会忘记处理异常。 2. 支持 Checked 异常: Unchecked 异常容易忘记处理,由于编译器不强制程序员捕获或传播它(第一条的反面表述)。 3. 支持 Unchecked 异常: 沿调用栈向上传播的 Checked 异常破坏了顶层的方法,因为这些方法必须声明抛出所有它们调用的方法抛出的异常。 4. 支持 Checked 异常: 当方法不声明它们会抛出何种异常时,就难以处

12、理它们抛出的异常。 5. 支持 Unchecked 异常: Check 异常的抛出作为方法接口的一部分,这使得添加或移除早期版本中方法的异常难以实现。 上述每一个观点都有相反的观点,下面我会详细讨论这些观点。 观点 1(支持 Checked 异常): 编译器强制检查, checked 异常必须被捕获或者传播,这样就不会忘记处理异常。 相反观点: 当被强制捕获或传播许多异常时,开发人员的效率会受到影响,也可能会只写 java view plaincopyprint? 1. try 2. callMethodThatThrowsException(); 3. catch(Exception e)

13、4. 来忽略错误(糊弄了事)。 观点 2(支持 Checked 异常): Unchecked 异常容易忘记处理,由于编译器不强制程序员捕获或传播它(第一条的反面表述)。 相反观点 1: 强制处理或传播 checked 异常导致的草率地异常处理非常糟糕。 相反观点 2: 在近期的一个大型项目中我们决定采用 unchecked 异常。我在这个项目中获得的经验是:使用 unchecked 异常时,任何方法都可能抛出异常。因此我不论在写哪一部分代码都时刻注意异常。而不只是声明了 checked 异常的地方。 此外,许多没有声明任何 checked 异常的标准的 Java API 方法会抛出诸如 Nul

14、lPointerException 或者InvalidArgumentException 之类的 unchecked 异常。你的应用程序需要处理这些 unchecked 异常。你可能会说 checked异常的存在让我们容易忘记处理 unchecked 异常,因为 unchecked 异常没有显式地声明。 观点 3(支持 Unchecked 异常): 沿调用栈向上传播的 Checked 异常破坏了顶层的方法,因为这些方法必须声明抛出所有它们调用的方法抛出的异常。即,声明的异常聚合了调用栈中所有的方法抛出的异常。例如: java view plaincopyprint? 1. public lon

15、g readNumberFromUrl(String url) 2. throws BadUrlExceptions, BadNumberException 3. String data = readDataFromUrl(url); 4. long number = convertData(data); 5. return number; 6. 7. 8. private String readDataFromUrl(String url) 9. throws BadUrlException 10. /throw BadUrlException if url is bad. 11. /read data and return it. 12. 13. 14. private long convert

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号