我们有一个Java应用程序,该应用程序具有一个Utilities类,该类具有许多静态方法和成员。 其中一个通过创建另一个类进行初始化,并调用它的方法
private static final Set<Class<? extends AbstractEntity>> ABSTRACT_ENTITIES = new Reflections("something").getSubTypesOf(AbstractEntity.class);
如果我错了,请纠正我,但是Java对待静态成员的方式是,它们将在开始时被初始化一次(我不记得这是在应用程序的初始化中还是在第一次引用类时)
我的问题是,如果我提到的成员的初始化引发异常,该怎么办?
当一个静态方法被调用时,我在探查器中注意到了这一点。该方法不使用此特定成员。
我没有发现任何不当行为(但这是一个很大的系统,我是新来的),但是异常似乎已经在本地运行20分钟内抛出了数百次,而我只做一些非常基本的事情。
我的第一个假设是,当抛出无法处理的异常时,静态方法将继续执行,然后在下一次调用该类中的方法时发生同样的事情。成员尝试初始化,作为异常抛出,等等。
我是否纠正由于静态成员未初始化而导致静态成员发生这种情况?
答案 0 :(得分:0)
静态最终变量在类加载期间初始化(每个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