Explanation of how classloader loads static variables
Asked Answered
C

2

12

Ok so this is a newbie question on java, but i can't seem to get my head around it.

I have the following code inside my class

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;
    }

This code is giving me a initialization exception due to a nullpointerexception in the following line

 String [] listCode = new String [LIST_INTEGER.length];

Seems the variable LIST_INTEGER is null at that time.

Can someone explain why? is the classloader process linear, in other words, does it invoke the method before fully loading all the other variables?

Coachwork answered 15/7, 2009 at 19:46 Comment(1)
move the declaration of LIST_INTEGER to the line before LIST_CODEAnopheles
B
12

Yes, in short, it is linear.

"What the compiler actually does is to internally produce a single class initialization routine that combines all the static variable initializers and all of the static initializer blocks of code, in the order that they appear in the class declaration. This single initialization procedure is run automatically, one time only, when the class is first loaded."

Taken from Java in a nutshell.

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

You should define the variables and then initialize them in a static intitializer block in the correct order, or you could swap the order of the statements as follows:

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(); 
Bookout answered 15/7, 2009 at 19:50 Comment(1)
Strictly speaking, it's not when the class is loaded but later, when it's initialized.Continuo
S
6

The JVM will, indeed, initialize the static fields in the order it encounters them.

A class's static fields are initialized when the class is first encountered by the JVM. According to Java Puzzlers, puzzle 49 (which goes on to reference JLS 4.12.5), static fields are first set to their default values. Object variables are set to null, ints are set to 0, etc. After that, their initializers are executed in order of appearance.

So, in your example, LIST_CODE and LIST_INTEGER are first set to null. Then, LIST_CODE is initialized by calling gerarListCode(). LIST_INTEGER is still null when that method is executed. Only after that, LIST_INTEGER is initialized with the literal value you give in your example.

Stuppy answered 15/7, 2009 at 19:49 Comment(1)
It's not to do with the class loader. It is implemented by javac creating the static initialiser in order of the source.Avictor

© 2022 - 2024 — McMap. All rights reserved.