静态成员每次引用时都会初始化吗

时间:2019-03-28 14:21:52

标签: java static

我们有一个Java应用程序,该应用程序具有一个Utilities类,该类具有许多静态方法和成员。 其中一个通过创建另一个类进行初始化,并调用它的方法

private static final Set<Class<? extends AbstractEntity>> ABSTRACT_ENTITIES = new Reflections("something").getSubTypesOf(AbstractEntity.class);

如果我错了,请纠正我,但是Java对待静态成员的方式是,它们将在开始时被初始化一次(我不记得这是在应用程序的初始化中还是在第一次引用类时)

我的问题是,如果我提到的成员的初始化引发异常,该怎么办?

当一个静态方法被调用时,我在探查器中注意到了这一点。该方法不使用此特定成员。

我没有发现任何不当行为(但这是一个很大的系统,我是新来的),但是异常似乎已经在本地运行20分钟内抛出了数百次,而我只做一些非常基本的事情。

我的第一个假设是,当抛出无法处理的异常时,静态方法将继续执行,然后在下一次调用该类中的方法时发生同样的事情。成员尝试初始化,作为异常抛出,等等。

我是否纠正由于静态成员未初始化而导致静态成员发生这种情况?

1 个答案:

答案 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