在Java中的检查异常
在Java中的检查异常
可能重复:
编辑:看来我的问题表达得不对,我能理解大家的不满。
我正在寻找一些解释应该在哪里使用受检异常以及哪里不应该使用的信息。关于这个主题的大部分信息都是片面的 - 爱恨之情。我认为人们会做出一个坏的假设,或者开发人员总是做得很糟糕。
编辑2:好吧,我做了一些谷歌搜索(我希望我在发布之前就这样做了),找到了一些平衡的答案。我把它们包含在这里,以帮助任何寻找答案而不是辩论的人(就像上面提到的重复帖子)
http://www.ibm.com/developerworks/java/library/j-jtp05254.html
在他的书《无EJB的J2EE设计》中,Rod对这个问题进行了平衡的讨论:
http://www.theserverside.com/tt/articles/article.tss?l=RodJohnsonInterview
而且,如果您在域对象上使用验证,使用受检异常可能不是个坏主意。无论如何,如果您阅读上述材料,您可能会被说服不使用受检异常或减少使用的机会。
Rich提供了一个很好的链接。谢谢,Rich!
http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html
还有一些:
http://www.oracle.com/technology/pub/articles/dev2arch/2006/11/effective-exceptions2.html
在Java中出现Checked exceptions的原因是为了在代码实现Iterator时能够处理异常。然而,Iterator接口本身并没有声明任何异常,因此无法通过Iterator接口抛出Checked exceptions。因此,在Iterator中发生的任何异常都必须是unchecked异常。
解决方法是在使用Iterator的代码中处理异常。如果在hasNext()调用的代码中抛出了Checked exceptions,那么使用Iterator的代码应该知道这一点。由于hasNext()方法本身不抛出任何Checked exceptions,所以不能直接在该方法中处理异常。
一个可能的解决方法是在Iterator的实现中使用try-catch语句来捕获并处理异常,然后将异常包装成unchecked异常并抛出。这样,使用Iterator的代码可以通过捕获unchecked异常来处理异常情况。
以下是一个示例代码:
public class MyIterator implements Iterator{ private List list; private int index; public MyIterator(List list) { this.list = list; this.index = 0; } public boolean hasNext() { try { // Code that may throw a checked exception // ... } catch (CheckedException e) { throw new RuntimeException(e); // Wrap checked exception as unchecked exception } return index < list.size(); } public String next() { return list.get(index++); } public void remove() { list.remove(index); } }
这样,使用MyIterator的代码可以通过捕获RuntimeException来处理可能发生的异常情况。这种解决方法可以在Iterator的实现中处理Checked exceptions,并将其转换为unchecked异常,以便在使用Iterator的代码中进行处理。