未报告的异常必须被捕获或声明为在静态初始化器中抛出

问题描述 投票:0回答:1

我有这个代码:

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

在这种情况下如何声明要抛出的异常?我知道我能听懂,我的问题是关于语法的。

java
1个回答
7
投票

如果你想保留

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 节)可以抛出已检查异常类,则这是一个编译时错误。

此限制不适用于未经检查的(运行时)异常。

© www.soinside.com 2019 - 2024. All rights reserved.