2013-02-15 4 views
0

Я получаю ошибку выполнения в своем Java-коде, и я пытаюсь понять причину этого. Эти два статических модификатора доступа между двойными звездочками - это элементы, о которых идет речь. Код компилируется с этими модификаторами или без них (звездочки удалены, конечно). Но во время выполнения он работает только без ошибок при наличии модификаторов. Почему это? Ошибка, созданная во время выполнения, когда статические модификаторы отсутствуют, приклеивается под кодом. Большое вам спасибо за вашу помощь!Модификатор доступа Java и NullPointerException

Вот код:

public class Blue { 


    public int[][] multiArray(int x, int y){ 

     int[][] myArray = new int[x][y]; 
     return myArray; 

    } 

    static Blue blueObject = new Blue(); 

    public **static** int[][] one = blueObject.multiArray(3,3); 
    public **static** int[][] two = blueObject.multiArray(3,3); 

    public static void main(String[] args){ 

     System.out.println("Hello world!"); 

    } 

} 

Ошибка генерируется во время выполнения без статические модификаторы доступа:

Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.lang.NullPointerException 
    at Blue.<init>(Blue.java:13) 
    at Blue.<clinit>(Blue.java:11) 
+0

Работает для меня. проверьте здесь http://ideone.com/eyOn0x – ankurtr

ответ

0

Проблема связана с тем, как JVM имеет дело с загрузкой классов и как определяется ваш класс. Когда у вас есть static int [] [] one, это работает, потому что JVM читает/загружает статический код того же порядка, что и в классе. Поэтому, когда JVM пытается инициализировать int [] [] one, static Blue blueObject готов к использованию.

Однако, если вы объявите ИНТ [] [] один, как нестатической, когда JVM пытается создать статический Синий blueObject, он должен создать полностью инициализирован синий объект и присвоить его статического blueobject , поэтому он пытается инициализировать int [] []; но в данный момент ваш статический blueObject .multiArray (3,3); еще не готов.

Я надеюсь, имеет смысл на ваш вопрос.

+0

Это имеет смысл. Я просто хочу проверить, это ** не **, что переменные экземпляра компилируются перед статическими переменными.Скорее, проблема здесь в том, что когда я вызываю конструктор Blue(), он пытается инициализировать переменные экземпляра объекта, которые назначаются значениям, предоставленным самим объектом. Поскольку blueObject еще не существует, это невозможно, что вызвало ошибку. Я просто хотел повторить то, что вы сказали своими словами, чтобы я правильно понял. Спасибо огромное! – voltair

+0

Да, это так. Я поставлю пример кода в поле ответа, чтобы это было ясно. – spiritwalker

0

Это потому, что вы объявили blueObject как статические, чанг определение:

Test blueObject = new Test(); 

и он будет работать !

Либо работа в режиме «singleton» (все статична), либо в «объектном режиме» (где вы создаете объект и вызываете методы класса через объект) - вы не можете иметь оба.

0

@ user1419674 Обычно JVM сначала инициализирует статические переменные, а затем переменные экземпляра. А также статические переменные инициализируются только один раз при первом вызове кода.

public class Test { 
    public Test(){ 
     System.out.println("constructor of class Test"); 
    } 
} 

public class App { 
    private Test test = new Test(); 
    private static int s_i; 
    static { 
     s_i = 1; 
     System.out.println("initializing static field"); 
    } 

    public static void main(String args[]) { 
     App app1 = new App(); 
     App app2 = new App(); 
    } 
} 

Выполнение кода выше напечатает:

initializing static field 
constructor of class Test 
constructor of class Test 

Однако в вашем коде, статическая переменная типа самого синего. И это становится как инициализация static Blue blueObject зависит от инициализации int [] [] one который в истинном требует статический синий blueObject.

Смежные вопросы