快速业务通道

技巧:当不能抛出异常时 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
 (IOException ex) {      throw new RuntimeException(ex);    } }

不幸的是,虽然这样可以通过编译,但是这种方法也不管用,其原因较为微妙。Comparator 接口定义一个合约。这个合约不允许该方法抛出运行时异常(防止因违反泛型类型安全而成为调用代码中的 bug)。使用这个比较器的方法合理地依靠它来比较两个文件,而不抛出任何异常。它们没有准备好处理 compare() 中意外出现的异常。

正是由于这个微妙的原因,让运行时异常成为代码要处理的外部状况是一个坏主意。这样只是逃避问题,并没有真正处理问题。不处理异常所带来的不良后果仍然存在,包括毁坏数据和得到不正确的结果。

这样便陷入了困境。既不能在 compare() 内真正有效地处理异常,又不能在 compare() 之外处理异常。还剩下什么地方可以处理异常 — System.exit()? 惟一正确的办法是完全避免这种困境。幸运的是,至少有两种方法可以做到这一点。

技巧:当不能抛出异常时(3)

时间:2012-01-28 IBM Elliotte Rusty Harold

将问题一分为二

第一种办法是将问题一分为二。比较本身不会导致异常。比较的只是字符串而已。通过标准路径将文件转换成字符串才会导致异常。如果将可能抛出异常的操作与不会抛出异常的操作分开,那么问题就更容易处理了。也就是说,首先将所有文件对象转换为字符串,然后通过字符串比较器(甚至可以通过 java.lang.String 的自然排序)对字符串排序,最后使用排序后的字符串列表对原始的文件列表排序。这种方法不太直接,但是优点是在列表被改变之前就抛出 IOException。如果出现异常,它只会出现在预先设计好的地方,不会造成损害,调用代码可以指定如何处理异常。清单 4 对此作了演示:

清单 4. 先读取,然后排序

import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class FileComparator {    private static ArrayList<String> getCanonicalPaths(ArrayList<File> files)        throws IOException {      ArrayList<String> paths = new ArrayList<String>();      for (File file : files) paths.add(file.getCanonicalPath());      return paths;    }    public static void main(String[] args) throws IOException {     ArrayList<File> files = new ArrayList<File>();     for (String arg : args) {       files.add(new File(arg));     }     ArrayList<String> paths = getCanonicalPaths(files);     // to maintain the original mapping      HashMap<String, File> map = new HashMap<String, File>();     int i = 0;     for (String path : paths) {       map.put(path, files.get(i));       i++;     }     Collections.sort(paths);     files.clear();     for (String path : paths) {       files.add(map.get(path));     }    } }

清单 4 并没有消除出现 I/O 错误的可能性。这一点无法做到,因为这里的代码无力提供这样的功能。但是,可以将这个问题交给更合适的地方来处理。

技巧:当不能抛出异常时(4)

时间:2012-01-28 IBM Elliotte Rusty Harold

避免问题

前面提到的方法有点复杂,所以我建议另一种方法:不使用内置的 compare() 函数或 Collections.sort()。使用这样的函数也许比较方便,但是不适合当前情况。Comparable

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号