Try / Catch对构造类构造函数中抛出异常的影响

时间:2013-08-12 21:24:14

标签: java exception-handling try-catch throwable

我正在玩我的一些代码并遇到了一些我并不完全理解的东西。我有一个名为SentimentClassifier的类,其构造函数如下所示:

public SentimentClassifier(final int nGramToBeUsed)  {
    try {
        classifier = (DynamicLMClassifier<?>) AbstractExternalizable.readObject(new File(etc));
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我有另一个创建这个的类,如下所示:

public TwitterManager(final int nGramToBeUsed) {
    sentimentClassifier = new SentimentClassifier(nGramToBeUsed);
}

如果我像这样运行代码,一切正常。但是,如果我将第一个类从使用try/catch更改为throw异常,就像这样:

public SentimentClassifier(final int nGramToBeUsed) throws ClassNotFoundException, IOException  {
    classifier = (DynamicLMClassifier<?>) AbstractExternalizable.readObject(new File(etc));
}

突然,第二堂课抱怨IOException没有得到处理。为什么仅针对thrown例外而不针对try/catch

抛出此异常

4 个答案:

答案 0 :(得分:4)

当您从另一种方法M1调用方法M2时:

  • 如果M1中的某些代码引发了一些 Checked Exception ,并且方法M1本身会处理它,而不是抛出它,则不必在调用它时担心异常。

  • 现在,如果M1中引发的异常未在M1本身处理,而是在堆栈跟踪中向上传播,则M1必须声明该异常在投掷条款中。这只是为了方便调用方法知道它应该准备好处理这些异常以防它们被抛出。这只是 Checked Exception 的情况。

  • 但是如果调用方法M2没有处理该异常,它可以选择重新声明该异常被抛出在它自己的throws子句中,在这种情况下异常将是在堆栈跟踪中进一步传播。

  • 如果方法M2不执行前两个任务,则会出现编译错误。因为您没有给出任何正确的路径或方法来处理可抛出的异常。

注意上述所有参数仅适用于 Checked Exception 。对于未经检查的异常,您不需要自己处理它,也不需要在throws子句中声明它。


建议阅读:

答案 1 :(得分:4)

在Java中,如果方法声明抛出ExceptionRuntimeException除外),则调用者必须处理异常。他们可以通过以下两种方式之一做到这一点:抓住它,或宣布它们自己抛出它。

您将这两个异常的处理从SentimentClassifier构造函数移动到其调用者。

答案 2 :(得分:3)

如果构造函数声明了任何异常,则调用代码必须处理它们或声明它们。毕竟,构造函数可以抛出/传播这些异常,任何调用它的代码都必须处理它们。

答案 3 :(得分:2)

当您捕获异常时,这意味着您将在catch块上处理它及其后果,因此外部代码可以继续进行而不会被警告内部异常。< / p>

如果您的异常是抛出,那么您正在通过合同强制任何creator / invoker类来处理在初始化/执行过程中可能产生的任何声明的异常,因为它对于业务逻辑。

在这种情况下,如果在init期间可以生成的异常是关键的,并且可能会阻止类正常工作,那么它们应该被抛出,因为创建者类TwitterManager可能具有异常或部分初始化的实例SentinelClassifier对象,导致意外错误。