4

上下文: java.io.File 类有一个静态内部类方法如下:

    LazyInitialization.temporaryDirectory();

[编辑添加更多代码]我下面的代码最终调用了上面的代码行。从temporaryDirectory() 方法中抛出一个异常,在我的上下文中这是好的/预期的。

try {
    File tempFile = File.createTempFile("aaa", "aaa");
} catch (Exception e) {
    // handle exception 
}

然后,当我再次调用相同的方法 (createTempFile) 时,我收到“java.lang.NoClassDefFound 错误 - 无法初始化类 java.io.File$LazyInitialization”

问题:我假设内部类 LazyInitialization 在调用其静态方法时应该由类加载器加载,即使内部方法抛出异常。然而,为什么我在第二次调用时会看到 NoClassDefFound 错误?原来的假设不正确吗?

4

1 回答 1

7

当静态初始化代码抛出运行时异常时,它被 ExceptionInInitializerError 包装,并在触发类加载的代码的上下文中抛出(如果是 Error 异常,则不包装)。此时,类加载失败。因此,以后任何尝试使用它都会导致 NoClassDefFoundError。

也许这就是你所经历的。

于 2010-12-13T22:18:42.103 回答