Explanation of how classloader loads static variables
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
, int
s 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.
Related videos on Youtube
Nuno Furtado
Not much to say, just learning my way through the IT world
Updated on April 21, 2022Comments
-
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 almost 15 yearsmove the declaration of LIST_INTEGER to the line before LIST_CODE
-
-
Brett almost 15 yearsIt's not to do with the class loader. It is implemented by javac creating the static initialiser in order of the source.
-
Lew Bloch almost 7 yearsStrictly speaking, it's not when the class is loaded but later, when it's initialized.