我们在Java中有一个应用程序,它有一个Utilities类,它有一堆静态方法和成员。其中一个通过创建另一个类并调用它的方法来初始化
private static final Set<Class<? extends AbstractEntity>> ABSTRACT_ENTITIES = new Reflections("something").getSubTypesOf(AbstractEntity.class);
如果我错了,请纠正我,但他们认为Java处理静态成员的方式是,他们将在开始时初始化一次(我不记得这是在应用程序的初始化中还是第一次引用类)。
我的问题是,如果我提到的成员的初始化引发异常会发生什么?
当调用其中一个静态方法时,我在分析器中注意到了这一点。该方法不使用此特定成员。
我没有发现任何不当行为(但这是一个很大的系统而且我是新的)但是异常似乎已经在本地运行20分钟内被抛出了数百次,我只做了一些非常基本的事情。
我的第一个假设是,当抛出一个未被处理的异常时,静态方法继续并执行,然后下次调用类中的方法时,会发生同样的事情。该成员尝试初始化,抛出异常等等。
我是否正确,这是静态成员因异常而未初始化时可能发生的情况?
静态最终变量在类加载期间初始化(每个ClassLoader一次)。如果在初始化期间发生异常,则类加载将失败。
例:
package test;
import java.util.Optional;
public class SomeClass {
private static final Object SOME_VARIABLE = Optional.empty().orElseThrow(RuntimeException::new);
public static void main(String[] args) {
}
}
原因:
java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException
at java.util.Optional.orElseThrow(Optional.java:290)
at test.SomeClass.<clinit>(SomeClass.java:7)
Exception in thread "main"
和:
package test;
public class SomeClass {
private static final Object SOME_VARIABLE = new SomeClass();
public static void main(String[] args) {
Object a = SomeClass.SOME_VARIABLE;
Object b = SomeClass.SOME_VARIABLE;
if (a == b) {
System.out.println("same instance");
}
}
}
生产:
same instance