Java Try/Catch对构造类中抛出异常的影响';建造师
我在玩我的一些代码,遇到了一些我不完全理解的东西。我有一个名为感伤分类器的类,其构造函数如下所示:Java Try/Catch对构造类中抛出异常的影响';建造师,java,exception-handling,try-catch,throwable,Java,Exception Handling,Try Catch,Throwable,我在玩我的一些代码,遇到了一些我不完全理解的东西。我有一个名为感伤分类器的类,其构造函数如下所示: public SentimentClassifier(final int nGramToBeUsed) { try { classifier = (DynamicLMClassifier<?>) AbstractExternalizable.readObject(new File(etc)); } catch (ClassNotFoundExcepti
public SentimentClassifier(final int nGramToBeUsed) {
try {
classifier = (DynamicLMClassifier<?>) AbstractExternalizable.readObject(new File(etc));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果我像这样运行代码,一切正常。但是如果我将第一个类从使用try/catch
更改为throw
异常,如下所示:
public TwitterManager(final int nGramToBeUsed) {
sentimentClassifier = new SentimentClassifier(nGramToBeUsed);
}
public SentimentClassifier(final int nGramToBeUsed) throws ClassNotFoundException, IOException {
classifier = (DynamicLMClassifier<?>) AbstractExternalizable.readObject(new File(etc));
}
public情感分类器(final int-nGramToBeUsed)抛出ClassNotFoundException、IOException{
分类器=(DynamicClassifier)AbstractExternalizable.readObject(新文件(etc));
}
突然,第二个类抱怨没有处理
IOException
。为什么只针对抛出的异常而不是try/catch
抛出此异常?如果构造函数声明了任何异常,调用代码必须处理或声明它们。毕竟,构造函数可以抛出/传播这些异常,调用它的任何代码都必须处理它们。如果构造函数声明了任何异常,则调用代码必须处理或声明它们。毕竟,构造函数可以抛出/传播这些异常,调用它的任何代码都必须处理它们。当您从另一个方法调用方法M1
时M2
:
- 如果
M1
中的某些代码引发了一些选中的异常,并且M1
方法本身会处理它,而不是抛出它,那么在调用它时就不必担心异常
- 现在,如果在
M1
中引发的异常没有在M1
本身中处理,而是向上传播堆栈跟踪,那么M1
必须在throws子句中声明该异常。这只是为了方便调用方法知道它应该准备好在抛出异常时处理这些异常。只有选中例外时才是这种情况
- 但是,如果调用方法
M2
没有处理该异常,它可以选择在自己的throws子句中重新声明要抛出的异常,在这种情况下,异常将进一步传播到堆栈跟踪
- 如果方法
M2
不执行前两项任务中的任何一项,您将得到一个编译器错误。因为您没有给出任何正确的路径或方法来处理可能引发的异常
注意:以上所有参数仅适用于选中的异常。对于未检查的异常,您不需要自己处理它,也不需要在throws子句中声明它
建议阅读:
当您从另一个方法M2
调用方法M1
时:
- 如果
M1
中的某些代码引发了一些选中的异常,并且M1
方法本身会处理它,而不是抛出它,那么在调用它时就不必担心异常
- 现在,如果在
M1
中引发的异常没有在M1
本身中处理,而是向上传播堆栈跟踪,那么M1
必须在throws子句中声明该异常。这只是为了方便调用方法知道它应该准备好在抛出异常时处理这些异常。只有选中例外时才是这种情况
- 但是,如果调用方法
M2
没有处理该异常,它可以选择在自己的throws子句中重新声明要抛出的异常,在这种情况下,异常将进一步传播到堆栈跟踪
- 如果方法
M2
不执行前两项任务中的任何一项,您将得到一个编译器错误。因为您没有给出任何正确的路径或方法来处理可能引发的异常
注意:以上所有参数仅适用于选中的异常。对于未检查的异常,您不需要自己处理它,也不需要在throws子句中声明它
建议阅读:
当您捕获一个异常时,这意味着您将在catch块上处理它及其后果,因此外部代码可以继续进行,而不会被警告内部异常
如果您的异常被抛出,您将通过契约强制任何创建者/调用者类处理在初始化/执行过程中可能产生的任何已声明异常,因为它可能对业务逻辑至关重要
在这种情况下,如果在init期间生成的异常是关键的,并且可能会阻止类正常工作,那么应该抛出这些异常,因为创建者类TwitterManager
可能有一个SentinelClassifier
对象的不起作用或部分初始化的实例,导致意外错误。当您捕获一个异常时,这意味着您将在catch块上处理它及其后果,因此外部代码可以继续进行,而不会被警告内部异常
如果您的异常被抛出,您将通过契约强制任何创建者/调用者类处理在初始化/执行过程中可能产生的任何已声明异常,因为它可能对业务逻辑至关重要
在这种情况下,如果在init期间生成的异常是关键的,并且可能会阻止类正常工作,那么应该抛出这些异常,因为创建者类TwitterManager
可能有一个SentinelClassifier
对象的不起作用或部分初始化的实例,导致意外错误。在Java中,如果一个方法声明抛出一个异常
(而不是运行时异常
),调用方必须处理该异常。