Java实用技巧:当不能抛出checked异常时

发表于:2010-11-22 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Elliotte Rusty Harol    来源:51Testing软件测试网采编

  这不是唯一的方法。为了清晰,清单6有意模仿已有的Collections.sort()方法;但是,也许更有效的方法是返回一个新的列表,而不是直接修改旧列表,以防在修改列表时抛出异常所带来的损害。

  最终,您实际上承认并着手处理可能出现的I/O错误,而不是逃避它,您甚至可以做更高级的错误修正。例如,IOComparator也许不会被一次I/O错误难倒—因为很多I/O问题是暂时的—可以重试几次,如清单7所示:

  1. 清单7.如果一开始不成功,再试几次(但是别试太多次)  
  2. importjava.io.File;  
  3. importjava.io.IOException;  
  4.  
  5. publicclassCanonicalPathComparatorimplementsIOComparator<File>{  
  6.  
  7. @Override  
  8. publicintcompare(Filef1,Filef2)throwsIOException{  
  9. for(inti=0;i<3;i++){  
  10. try{  
  11. returnf1.getCanonicalPath().compareTo(f2.getCanonicalPath());  
  12. }  
  13. catch(IOExceptionex){  
  14. continue;  
  15. }  
  16. }  
  17. //lastchance  
  18. returnf1.getCanonicalPath().compareTo(f2.getCanonicalPath());  
  19. }  
  20.  

  这种技巧不能解决常规的Comparator的问题,因为必须重试无数次才能避免抛出异常,而且很多I/O问题并不是暂时性的。

  checked异常是坏主意吗?

  如果java.io.IOException是运行时异常,而不是checked异常,问题是不是有所改观?答案是否定的。如果IOException扩展RuntimeException而不是java.lang.Exception,那么更容易编写出有bug的、不正确的代码,这种代码忽略了真正可能发生的I/O错误,而在运行时出人意料地失败。

  然而,编写正确的、有准备并且能够处理I/O错误的代码并不会更容易。是的,相对于不会出现意外I/O错误,不需要为此做准备的情况,这种方法更加复杂。但是,从Java语言中消除checked异常无助于我们实现那样的理想情况。I/O错误和其他环境问题是常态,积极准备比视而不见要好得多。

  总之,checked异常作为方法签名的一部分并非没有道理。当您发现自己想要从一个方法抛出一个checked异常,而这又是不允许的—因而抑制本不该抑制的异常—那么回过头来,重新组织一下,考虑为什么一开始要覆盖那个方法。很可能,您本应该采取完全不同的方式。

相关链接:

Java应用程序常见异常类解析

如何更合理的利用Java中的异常抛出

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号