静态块中的Java ExceptionInitializationError

时间:2019-05-30 14:30:12

标签: java spring spring-boot

我试图在静态块内调用URL检索方法,bean的实例化失败;嵌套的异常是java.lang.ExceptionInInitializerError。

我正在尝试从配置文件中获取WSDL URL。此配置数据存储在数据库中。

static 
{
    URL url = null;
    WebServiceException e = null;
    try 
{
    url = getVertexConfiguration();
    } catch (MalformedURLException ex) {
            e = new WebServiceException(ex);
        }
    }

private static URL getVertexConfiguration() throws MalformedURLException
    {
        try {
            configuration = configurationDAO.getByRefName("tax/vertex",
                    SecureSession.getUser().getDataDomain() != null ?
                            SecureSession.getUser().getDataDomain() : "app.cantata");
        } catch (B2BTransactionFailed b2BTransactionFailed) {

        }

        Map<String, DynamicAttribute> vertexTaxConfig = configuration.getConfigs();
        vertexWsdlUrl = vertexTaxConfig.get("vertexWsdlUrl").getValue().toString();

        return new URL(vertexWsdlUrl);
    }

}

我正在获取静态块,bean的实例化失败;嵌套的异常是java.lang.ExceptionInInitializerError。

4 个答案:

答案 0 :(得分:0)

您为什么还要尝试这个?我认为您尝试访问protected function schedule(Schedule $schedule){ $schedule->command('ticket:completion') ->hourly(); } 的那一刻甚至还没有初始化。

正如我们在评论中讨论的那样,我绝对会建议您,作者,正确注入您的依赖项,例如:

configurationDAO

或者您甚至可以在构造函数中初始化@Service public class ConfigurationService { private final ConfigurationDao configurationDao; private URL url; public ConfigurationService(ConfigurationDao configurationDao) { this.configurationDao = configurationDao; } @PostConstruct private void init() { // your stuff here } }

url

答案 1 :(得分:0)

根本原因是,静态块是在设置为类级别初始化时(甚至在构造函数调用之前)的最早步骤。也就是说,您对静态块的依赖,例如configurationDAO尚未初始化。您不应该为此使用static。相反,您应该使其成为普通的Instance方法。

答案 2 :(得分:-1)

如果静态初始值设定项块中存在某些错误,则会得到ExceptioninInitializerBlock。您只能处理MalformedURLException,但是可能还有其他人。

您应该为所有例外添加另一个catch,然后查看在那里发生的情况。

static {
    URL url = null;
    WebServiceException e = null;
    try {
        url = getVertexConfiguration();
    } catch (MalformedURLException ex) {
        e = new WebServiceException(ex);
    } catch (Exception e) {
        //real problem
    }
}

答案 3 :(得分:-1)

该异常是运行静态初始化程序时发生的错误的中继机制。异常应该有一个原因,它将描述实际错误。根据上面的描述,看起来有三层异常:来自bean初始化的错误报告,ExceptionInInitializer异常,然后是ExceptionInInitializer异常的原因。 应该显示异常处理,但可能不会显示所有三层,这将使发现基本异常更加困难。

来自ExceptionInInitializer javaDoc:

 * Signals that an unexpected exception has occurred in a static initializer.
 * An <code>ExceptionInInitializerError</code> is thrown to indicate that an
 * exception occurred during evaluation of a static initializer or the
 * initializer for a static variable.

作为备用,您可以在getVertexConfiguration的{​​{1}}内放入try-catch,然后将catch块打印出来:

Throwable