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

问题描述 投票:0回答:1

我们在Java中有一个应用程序,它有一个Utilities类,它有一堆静态方法和成员。其中一个通过创建另一个类并调用它的方法来初始化

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

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

我的问题是,如果我提到的成员的初始化引发异常会发生什么?

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

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

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

我是否正确,这是静态成员因异常而未初始化时可能发生的情况?

java static
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.