类加载器如何加载静态变量的说明

时间:2009-07-15 19:46:35

标签: java static classloader

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

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

2 个答案:

答案 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),静态字段首先被设置为其默认值。对象变量设置为nullint s设置为0等。之后,它们的初始值设定项按出现顺序执行。

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