1

我正在玩弄我的一些代码,遇到了一些我不完全理解的东西。我有一个名为 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);
}

如果我像这样运行代码,一切正常。但是,如果我将第一个类从 usingtry/catch更改throw为 exception,如下所示:

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

突然,第二节课抱怨说IOException没有得到处理。为什么仅针对thrown异常而不是针对try/catch?

4

4 回答 4

4

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

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

  • 现在,如果 , 中引发的异常本身M1没有被处理M1,而是向上传播到堆栈跟踪,则M1必须在 throws 子句中声明该异常。这只是为了方便调用方法知道它应该准备好处理那些异常,以防它们被抛出。这仅适用于Checked Exception

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

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

请注意,上述所有参数仅适用于Checked Exception。对于 Unchecked 异常,不需要自己处理,也不需要在 throws 子句中声明。


推荐阅读:

于 2013-08-12T21:32:06.747 回答
4

在 Java 中,如果一个方法声明抛出一个Exception(不是RuntimeException),调用者必须处理异常。他们可以通过以下两种方式之一来做到这一点:抓住它,或者声明他们自己扔掉它。

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

于 2013-08-12T21:32:29.623 回答
3

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

于 2013-08-12T21:31:54.310 回答
2

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

如果您的异常被抛出,您将通过合同强制任何创建者/调用者类处理可能在初始化/执行过程中产生的任何声明的异常,因为它可能对业务逻辑至关重要。

在这种情况下,如果在 init 期间可能生成的异常很严重,并且可能会导致类无法正常工作,则应该抛出它们,因为创建者类TwitterManager可能具有对象的无功能或部分初始化的实例SentinelClassifier,从而导致意外错误.

于 2013-08-12T21:32:19.423 回答