我有这个代码:
class C {
private static final Object myObject = makeObject(); // *
private static Object makeObject() throws IOException {
try {
...
} catch (IOException e) {
...
throw e;
}
}
}
当我尝试编译它时,我在标有
*
: 的行中遇到异常
error: unreported exception IOException; must be caught or declared to be thrown
在这种情况下如何声明要抛出的异常?我知道我能听懂,我的问题是关于语法的。
如果你想保留
makeObject()
扔IOException
的签名,你必须这样做:
class C {
private static final Object myObject;
static {
try {
myObject = makeObject();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static Object makeObject() throws IOException {
try {
...
} catch (IOException e) {
...
throw e;
}
}
}
不允许从初始化(静态)字段或静态块内的方法抛出已检查的异常。但允许抛出未经检查的(运行时)异常。因此,您必须抓住您的
IOException
并将其包装在 RuntimeException
(的子类)中。
或者,您也可以不从
IOException
中扔出 makeObject()
,只需在此处进行包装即可:
class C {
private static final Object myObject = makeObject(); // OK now
private static Object makeObject() { // no 'throws'
try {
...
} catch (IOException e) {
...
throw new RuntimeException(e); // wrap here
}
}
}
IOException
是一个已检查异常,Java 语言规范禁止(可能)在类变量初始值设定项或静态初始值设定项中抛出该异常(请参阅 JLS §11.2.3. 异常检查):
如果命名类或接口的类变量初始值设定项(第 8.3.2 节)或静态初始值设定项(第 8.7 节)可以抛出已检查异常类,则这是一个编译时错误。
此限制不适用于未经检查的(运行时)异常。