类加载器加载如何静态变量的说明(Explanation of how classloader loa

2019-06-26 01:34发布

好了,所以这是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在当时是零。

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

Answer 1:

是的,总之,它是线性的。

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

从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(); 


Answer 2:

JVM将,的确,初始化它遇到它们的顺序静态字段。

上课的时候首先由JVM遇到一个类的静态字段都被初始化。 据Java的谜题 ,拼图49(其中接着引用JLS 4.12.5),静态字段首先被设置为默认值。 对象变量设置为nullint s的设置为0,等等之后,他们的初始化是在外观上的顺序执行。

所以,在你的榜样, LIST_CODELIST_INTEGER是第一套null 。 然后, LIST_CODE通过调用初始化gerarListCode() LIST_INTEGER仍然是null是执行的方法时。 只有在此之后, LIST_INTEGER初始化与你在你的例子给文字值。



文章来源: Explanation of how classloader loads static variables