好的,这是一个关于java的新手问题,但我似乎无法理解它。
我的课程中有以下代码
private static final String [] LIST_CODE = gerarListCode();
private static final int [][] LIST_INTEGER = new int [][] {
{947,947}, {110,103},
{947,958}, {110,120},
{947,954}, {103,107},
{947,967}, {110,99,104}};
private static String [] gerarListCode()
{
String [] listCode = new String [LIST_INTEGER.length];
for (int i=0 ; i<LIST_INTEGER.length ; i++)
{
//do some stuff
}
return listaUnicode;
}
由于以下行中的nullpointerexception,此代码给出了初始化异常
String [] listCode = new String [LIST_INTEGER.length];
似乎那时变量LIST_INTEGER为空。
有人可以解释原因吗?是类加载器进程是线性的,换句话说,它是在完全加载所有其他变量之前调用该方法吗?
答案 0 :(得分:11)
是的,简而言之,它是线性的。
“编译器实际做的是 内部产生一个单独的类 组合的初始化例程 所有静态变量初始值设定项 和所有静态初始化程序 代码块,按它们的顺序排列 出现在类声明中。这个 运行单个初始化过程 自动,只有一次,当 class首先加载。“
简而言之,取自Java。
http://www.developer.com/java/other/article.php/2238491
您应该定义变量,然后以正确的顺序在静态intitializer块中初始化它们,或者您可以按如下方式交换语句的顺序:
private static final int [][] LIST_INTEGER = new int [][] { {947,947}, {110,103},
{947,958}, {110,120},
{947,954}, {103,107},
{947,967}, {110,99,104}};
private static final String [] LIST_CODE = gerarListCode();
答案 1 :(得分:4)
JVM确实会按照遇到的顺序初始化静态字段。
当JVM第一次遇到类时,会初始化类的静态字段。根据{{3}},谜题49(继续引用JLS 4.12.5),静态字段首先被设置为其默认值。对象变量设置为null
,int
s设置为0等。之后,它们的初始值设定项按出现顺序执行。
因此,在您的示例中,LIST_CODE
和LIST_INTEGER
首先设置为null
。然后,通过调用LIST_CODE
初始化gerarListCode()
。执行该方法时,LIST_INTEGER
仍为null
。只有在此之后,LIST_INTEGER
才会使用您在示例中提供的文字值进行初始化。