代码之家  ›  专栏  ›  技术社区  ›  Nuno Furtado

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

  •  9
  • Nuno Furtado  · 技术社区  · 15 年前

    好吧,这是一个关于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];
    

    此时变量列表_integer似乎为空。

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

    2 回复  |  直到 15 年前
        1
  •  11
  •   Jonathan Holloway    15 年前

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

    “编译器实际上做的是 内部生成单个类 组合的初始化例程 所有静态变量初始值设定项 以及所有的静态初始值设定项 代码块的顺序 出现在类声明中。这个 运行单个初始化过程 自动,仅一次,当 类是第一个加载的。”

    简而言之,取自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(); 
    
        2
  •  4
  •   jqno    15 年前

    实际上,JVM将按照遇到静态字段的顺序初始化这些字段。

    当JVM第一次遇到类时,将初始化类的静态字段。根据 Java Puzzlers ,拼图49(参考JLS 4.12.5),静态字段首先设置为其默认值。对象变量设置为 null , int s被设置为0等。之后,它们的初始值设定项按外观的顺序执行。

    在你的例子中, LIST_CODE LIST_INTEGER 首先设置为 无效的 . 然后, 列表代码 通过调用初始化 gerarListCode() . 列表整数 仍然是 无效的 当该方法被执行时。只有在那之后, 列表整数 是用您在示例中给出的文本值初始化的。