9

好的,这是一个关于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 为空。

有人可以解释为什么吗?类加载器过程是否是线性的,换句话说,它是否在完全加载所有其他变量之前调用该方法?

4

2 回答 2

11

是的,简而言之,它是线性的。

“编译器实际上做的是在内部产生一个单一的类初始化例程,它结合了所有静态变量初始化器和所有静态初始化器代码块,按照它们出现在类声明中的顺序。这个单一的初始化过程是自动运行的,只有一次,在第一次加载类时。”

简而言之,取自 Java。

http://www.developer.com/java/other/article.php/2238491

您应该定义变量,然后以正确的顺序在静态初始化程序块中初始化它们,或者您可以交换语句的顺序,如下所示:

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(); 
于 2009-07-15T19:50:44.343 回答
4

实际上,JVM 会按照遇到静态字段的顺序来初始化它们。

JVM 首次遇到类时会初始化类的静态字段。根据Java Puzzlers的谜题 49(继续引用 JLS 4.12.5),静态字段首先设置为其默认值。对象变量设置为nullints 设置为 0 等。之后,它们的初始化程序按出现的顺序执行。

因此,在您的示例中,LIST_CODE并且LIST_INTEGER首先设置为null. 然后,LIST_CODE通过调用初始化gerarListCode()LIST_INTEGER仍在null执行该方法时。只有在那之后,LIST_INTEGER才会使用您在示例中给出的文字值进行初始化。

于 2009-07-15T19:49:23.253 回答