【发布时间】:2018-07-16 15:49:53
【问题描述】:
为什么第一个代码 sn-p 编译失败(编译错误“初始化程序无法正常完成”)而第二个代码编译正常?唯一的区别在于抛出异常的方式!
class CompilationFailsClass {
{
// c.ERR Initializer does not complete normally
throw new IOException();
}
public CompilationFailsClass() throws IOException {
// constructor
}
}
对
class CompilationOKClass {
// with empty body effect is exactly same
static void f() throws IOException { throw new IOException(); }
{
f(); // OK !
}
public CompilationOKClass() throws IOException {
}
}
如果实例变量初始化器是编译时错误 (第 8.3.2 节)或命名类的实例初始化程序(第 8.6 节)可以抛出 检查异常类,除非命名类至少有一个 显式声明的构造函数和异常类或其之一 超类在每个的 throws 子句中显式声明 构造函数。
【问题讨论】:
-
@Tom f() throws IOException { throw new IOException(); } 产生相同的效果(编译得很好!)。好的,我更正了这个问题,现在它已经 100% 清楚了。
-
在第一个初始化块中有
throw new IOException();。它不应该是某种方法的一部分吗? -
值得整理您的问题以一致且惯用地格式化所有代码。这将使整个事情更容易阅读。
标签: java initializer