【问题标题】:Effects of Try/Catch against Throwing Exceptions in a constructing class' constructorTry/Catch 对构造类的构造函数中抛出异常的影响
【发布时间】:2013-08-12 21:24:13
【问题描述】:

我在玩弄我的一些代码时遇到了一些我不完全理解的东西。我有一个名为 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 抛出此异常?

【问题讨论】:

  • Java 的许多 IO 方法(例如 File 的构造函数要求方法位于 try/catch 块中。
  • @Xynariz:您能提供相应文档的链接吗?我确实查找了 API,但什么也没看到。可能只是错过了。
  • link here - 与大多数异常一样,IOException 必须被“捕获或声明为抛出”。
  • @Xynariz:我现在明白了。没有意识到当它被抛出时,它是调用方的责任来处理它。谢谢
  • 阅读其他答案 - 他们说同样的话,但比我解释得更好。

标签: java exception-handling try-catch throwable


【解决方案1】:

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

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

  • 1234563这只是为了方便调用方法知道它应该准备好处理那些异常,以防它们被抛出。这仅适用于Checked Exception。 1234563向上堆栈跟踪。
  • 如果方法M2 不执行前两个任务,您将收到编译器错误。因为你没有给出任何适当的路径或方法来处理可能抛出的异常。

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


建议阅读:

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        当你catch一个异常时,意味着你将在catch块上处理它,以及它的后果,所以外部代码可以继续进行而不被警告内部异常。

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

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

        【讨论】:

          猜你喜欢
          • 2014-11-03
          • 1970-01-01
          • 1970-01-01
          • 2017-02-09
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          • 2011-10-10
          • 2021-04-08
          相关资源
          最近更新 更多