WEB开发网
开发学院软件开发Java 技巧:当不能抛出异常时 阅读

技巧:当不能抛出异常时

 2010-05-04 00:00:00 来源:WEB开发网   
核心提示: 不幸的是,该代码不能通过编译,技巧:当不能抛出异常时(2),问题在于,getCanonicalPath() 方法抛出一个 IOException,那么最后还剩下一个折中选项:在 compare() 中捕捉异常,将它转换成运行时异常,因为它需要访问文件系统,通常

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

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

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

通常,至于选择何种方法,取决于是否能在抛出异常时合理地处理异常。如果能,那么使用 try-catch 块。如果不能,那么声明包装方法本身抛出异常。不幸的是,这两种技巧对于本例都不管用。

在 compare() 方法中无法合理地处理 IOException。从技术上讲,似乎可以做到 — 即返回 0、1 或 -1,如清单 2 所示:

清单 2. 抛出异常时返回一个默认值

public int compare(File f1, File f2) { 
  try { 
    return f1.getCanonicalPath().compareTo(f2.getCanonicalPath()); 
  } 
  catch (IOException ex) { 
    return -1; 
  } 
}

然而,这违反了 compare() 方法的约定,因为它不是一个稳定的结果。对于相同的对象,前后两次调用可能产生不同的结果。如果使用这个比较器来排序,那么意味着最终列表没有被正确排序。所以现在试试第 2 个选项 — 声明 compare() 抛出 IOException:

public int compare(File f1, File f2) throws IOException { 
  return f1.getCanonicalPath().compareTo(f2.getCanonicalPath()); 
}

这也不能通过编译。因为 checked 异常是方法签名的一部分,在覆盖方法时,不能增加 checked 异常,就像不能改变 return 类型一样。那么最后还剩下一个折中选项:在 compare() 中捕捉异常,将它转换成运行时异常,然后抛出运行时异常,如清单 3 所示:

上一页  1 2 3 4 5 6 7  下一页

Tags:技巧 不能 异常

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接