已检查和未检查的异常;是什么让他们不同?

时间:2014-01-20 17:01:45

标签: java exception

我一直在努力摆脱异常,但我遇到了一些问题。我将解释我所知道的内容,并将粗体文字添加到我不确定的部分:

我理解有Checked异常和Unchecked异常(后者都是RuntimeException的子类?)。

在可以抛出Checked异常的方法中,方法签名需要说明这一点(至少我是否理解了我对异常的正确理解?)。
例如:

public void m() throws IOException{
...
}

对于未经检查的例外情况,不需要这样做(它不需要,但可以?)

我也知道你可以“尝试”你的一段代码,任何可能抛出的异常都将被捕获到“catch”部分(Try-Catch)。 是否必须对已检查和未检查的例外执行此操作?我何时必须这样做?

澄清最后一个问题的第二部分,类似

public class A
{
    private int[] items;

    public int first()
    {
        return items[0];
    }
}

将返回NullPointerException。然而,没有Try-Catch部分,所以我何时需要使用Try-Catch,何时不需要?

提前多多感谢!

P.S。我已经在StackOverflow上阅读了关于这个主题的一些答案,但没有一个真正针对我遇到的问题。

2 个答案:

答案 0 :(得分:1)

了解异常的最重要的事情是你不需要抓住它们,至少不是直接发生的地方。异常的这个属性使它与返回值区别开来,并使其成为实现错误/异常事件处理通常所需的执行流模式的有用语言特性。

关于Java中异常的唯一令人分心的事情是经过检查的异常,这会导致处理它们的紧迫性。事实上,您不必处理已检查的异常,但是从异常到处理程序的完整调用路径必须与throws声明一起设置。这从非常尴尬到不可能。标准的解决方法是立即捕获已检查的异常,只是抛出另一个未经检查的异常,包装原始异常。

答案 1 :(得分:0)

回答这个问题:

  

我也知道你可以“尝试”你的一段代码,任何可能抛出的异常都将被捕获到“catch”部分(Try-Catch)。是否必须对已检查和未检查的异常执行此操作?我什么时候该做?

不希望或不能在throws子句中列出该异常。 (如果您正在编写一个覆盖父类中方法的方法,并且父类中的方法未在throws子句中列出异常,则子类中的重写方法无法列出它或者。)然后你必须使用try .. catch来处理它。如果Java编译器确信可以抛出已检查异常的任何位置,那么它将被catch捕获并处理,那么该程序是合法的。否则它将无法编译。

对于未经检查的异常,您永远不必catch异常来编译程序。

当然,如果您的程序有必要按照您想要的方式行事,那么您仍然“有”catch例外,即使是未经检查的例外情况。 (例如,如果没有捕获异常意味着您的网站上出现了一个丑陋的堆栈跟踪,并且您的客户变得非常恐怖,以至于他们再也不会访问它了。)但我只是谈论程序的合法性。