gpt4 book ai didi

Java初始化顺序错误

转载 作者:行者123 更新时间:2023-12-02 12:00:14 26 4
gpt4 key购买 nike

请问为什么下面的代码会出错:

class A
{
A()
{
statObj.x = 5;
}

int x;
static A statObj = new A();
}

我收到 ExceptionInInitializerError。我不明白为什么。在这种情况下,静态变量 statObj 将被初始化为第一个变量。因此,如果我是对的,静态对象 statObj = new A() 将被创建为第一个。

这个内部静态对象的创建和初始化顺序是什么?在调用内部静态对象构造函数之前,statObj.x 不是默认初始化为 0 值吗 statObj.A() ?如果是这样,为什么 statObj.x 的行为就像它没有初始化(我认为它默认由 0 值初始化)?

还有一个问题,为什么这个问题只发生在构造函数而不是方法中?下面的代码工作正常:

        class A
{
A()
{
}

void met1()
{
statObj.x = 5;
}

int x;
static A statObj = new A();
}


public MainClass
{
public static void main(String[] arg)
{
A a = new A();
a.statObj.met1();
}
}

最佳答案

考虑一下会发生什么。以下静态初始值设定项:

static A statObj = new A();

调用A(),然后尝试访问statObj:

A() {
statObj.x = 5;
}

但是,此时 statObj 尚未初始化,因此为 null。引发 NullPointerException,然后将其转换为 ExceptionInInitializerError(因为 NPE 发生在静态初始化程序中)。

第二个示例不存在此问题,因为当您尝试访问 statObj 时,它已完全初始化。

关于Java初始化顺序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13838821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com