Explanation of how classloader loads static variables

10,999

Solution 1

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

Solution 2

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.

Share:
10,999

Related videos on Youtube

Nuno Furtado
Author by

Nuno Furtado

Not much to say, just learning my way through the IT world

Updated on April 21, 2022

Comments

  • Nuno Furtado
    Nuno Furtado about 2 years

    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?

    • Ron
      Ron almost 15 years
      move the declaration of LIST_INTEGER to the line before LIST_CODE
  • Brett
    Brett almost 15 years
    It's not to do with the class loader. It is implemented by javac creating the static initialiser in order of the source.
  • Lew Bloch
    Lew Bloch almost 7 years
    Strictly speaking, it's not when the class is loaded but later, when it's initialized.