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

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

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

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

#
java
#
JAVA
#
Java

摘要:文章假设了一种环境,同时实例分析当不能处理、也不能抛出checked异常时,我们有哪些选择,每种选择对我们的程序有着怎样的影响。

  checked异常的一个问题是,有时候不允许抛出这样的异常。特别是,如果要覆盖超类中声明的方法,或者实现接口中声明的方法,而那个方法没有声明任何checked异常,那么新的实现也不能声明checked异常。

  因此必须预先处理异常,另外,可以将异常转换为运行时异常,或者绕过它而不处理它。但是,应该这样做吗,这其中是否隐藏着错误?

  问题

  只要看一个例子,问题就清楚了。假设有一个File对象的List,需要按它们的标准路径以字典顺序排序。所谓标准路径,是指在解析别名、符号链接和/../及/./之后得到的完整绝对路径。本地方法使用一个比较器,如清单1所示:

  1. 清单1.按标准路径比较两个文件  
  2. importjava.io.File;  
  3. importjava.io.IOException;  
  4. importjava.util.ArrayList;  
  5. importjava.util.Collections;  
  6. importjava.util.Comparator;  
  7. publicclassFileComparatorimplementsComparator<File>{  
  8. publicintcompare(Filef1,Filef2){  
  9. returnf1.getCanonicalPath().compareTo(f2.getCanonicalPath());  
  10. }  
  11. publicstaticvoidmain(String[]args){  
  12. ArrayList<File>files=newArrayList<File>();  
  13. for(Stringarg:args){  
  14. files.add(newFile(arg));  
  15. }  
  16. Collections.sort(files,newFileComparator());  
  17. for(Filef:files){  
  18. System.out.println(f);  
  19. }  
  20. }  

  不幸的是,该代码不能通过编译。问题在于,getCanonicalPath()方法抛出一个IOException,因为它需要访问文件系统。通常,当使用checked异常时,可以使用以下两种方法之一:

  1.将出错的代码包装在一个try块中,并捕捉抛出的异常。

  2.声明包装方法(本例为compare())也抛出IOException。

  通常,至于选择何种方法,取决于是否能在抛出异常时合理地处理异常。如果能,那么使用try-catch块。如果不能,那么声明包装方法本身抛出异常。不幸的是,这两种技巧对于本例都不管用。在compare()方法中无法合理地处理IOException。从技术上讲,似乎可以做到—即返回0、1或-1,如清单2所示:

  1. 清单2.抛出异常时返回一个默认值  
  2. publicintcompare(Filef1,Filef2){  
  3. try{  
  4. returnf1.getCanonicalPath().compareTo(f2.getCanonicalPath());  
  5. }  
  6. catch(IOExceptionex){  
  7. return-1;  
  8. }  

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号