“可能出错的事情和不可能出错的事情之间的主要区别是,当一件不可能出错的事情出错时,通常发现根本无法修理。” -道格拉斯·亚当斯
我有一类FileItems。FileItems构造函数获取一个文件,如果该文件不存在,则抛出异常(FileNotFoundException)。该类的其他方法也涉及文件操作,因此可以抛出FileNotFoundException。我想找到一个更好的解决方案。一种不需要其他程序员处理所有这些极不可能的FileNotFoundExceptions的解决方案。
问题事实:
目前的代码如下所示
public Iterator getFileItemsIterator() { try{ Scanner sc = new Scanner(this.fileWhichIsKnowToExist); return new specialFileItemsIterator(sc); } catch (FileNotFoundException e){ //can never happen} return null; }
如何在不定义自定义未经检查的FileNotFoundException的情况下更好地做到这一点?有什么方法可以将checkedException强制转换为uncheckException吗?
处理此问题的通常模式是异常链接。您只需将FileNotFoundException包装在RuntimeException中:
catch(FileNotFoundException e) { throw new RuntimeException(e); }
此模式不仅适用于在特定情况下(例如您的情况)无法发生异常的情况,而且适用于您无意或无意真正处理该异常的情况(例如数据库链接失败)。
编辑 :提防这种外观相似的反模式,我在野外经常看到的情况:
catch(FileNotFoundException e) { throw new RuntimeException(e.getMessage()); }
这样,您就丢弃了原始堆栈跟踪中的所有重要信息,这通常会使问题难以跟踪。
另一个编辑: 正如ThorbjørnRavn Andersen在他的答复中正确指出的那样,在注释中,或者甚至更好地,将异常链接到异常消息中来说明为什么要链接异常:
catch(FileNotFoundException e) { throw new RuntimeException( "This should never happen, I know this file exists", e); }