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

Nun*_*ado 9 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;
    }
Run Code Online (Sandbox Code Playgroud)

由于以下行中的nullpointerexception,此代码给出了初始化异常

 String [] listCode = new String [LIST_INTEGER.length];
Run Code Online (Sandbox Code Playgroud)

似乎那时变量LIST_INTEGER为null.

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

Jon*_*Jon 11

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

"编译器实际上做的是在内部生成一个单独的类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按它们在类声明中出现的顺序组合在一起.这个单独的初始化过程自动运行,只有一次,当班级第一次装载时."

简而言之,取自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(); 
Run Code Online (Sandbox Code Playgroud)


jqn*_*qno 6

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

当 JVM 第一次遇到该类时,该类的静态字段就会被初始化。根据Java Puzzlers的第 49 章(继续参考 JLS 4.12.5),静态字段首先被设置为其默认值。对象变量设置为nullints 设置为 0 等。之后,它们的初始值设定项按出现顺序执行。

因此,在您的示例中,LIST_CODELIST_INTEGER首先设置为null。然后,LIST_CODE通过调用 来初始化gerarListCode()。当该方法执行时LIST_INTEGER仍然是静止的。null仅在此之后,才LIST_INTEGER使用您在示例中给出的文字值进行初始化。