我想问一下为什么以下代码会导致错误:
class A
{
A()
{
statObj.x = 5;
}
int x;
static A statObj = new A();
}
Run Code Online (Sandbox Code Playgroud)
我得到了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();
}
}
Run Code Online (Sandbox Code Playgroud)
考虑会发生什么.以下静态初始化程序:
static A statObj = new A();
Run Code Online (Sandbox Code Playgroud)
调用A(),然后尝试访问statObj:
A() {
statObj.x = 5;
}
Run Code Online (Sandbox Code Playgroud)
但是,此时statObj尚未初始化,因此null.NullPointerException抛出A ,然后将其转换为ExceptionInInitializerError(因为NPE已经在静态初始化器中发生).
第二个示例没有此问题,因为在您尝试访问时statObj,它已完全初始化.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |