2013-07-20 3 views
0
import java.io.*; 
import java.lang.*; 

class sample 
{ 
public void print_func() 
{ 
System.out.println("This is fromprint_fun"); 
} 
} 

class test 
{ 
public final static sample s = null; 
} 

public class hello 
{ 
public static void main(String args[]) 
{ 
test.s.print_func(); 
System.out.println("Hello World"); 
} 
} 

Исключение в потоке «главный» java.lang.NullPointerException в hello.main (hello.java:22)Null pointer Исключение при использовании static as object?

Может кто-нибудь, дайте мне знать, что на самом деле проблема?

+0

Ваш вопрос был бы намного лучше, если бы вы следовали соглашениям об именах Java для всех ваших имен и разумно отделили ваш код. –

ответ

4

Да - s есть null. Вы никогда не инициализируете его непустой ссылкой, поэтому, когда вы пытаетесь разыменовать его, вызывая s.print_func, это вызывает исключение.

Это не имеет никакого отношения к переменной, являющейся статичной. Вы получите точно такое же исключение, если вы сделаете это:

public static void main(String args[]) 
{ 
    sample s = null; 
    s.print_func(); 
} 

EDIT: Для того, чтобы решить ваш комментарий более подробно, посмотрите на это:

class test 
{ 
    public final static sample s = null; 
} 

Объявляет класс, и в нем объявляет переменная. Это не объект. Важно различать три концепции:

  • Переменная, которая является именованным местом хранения. Переменная имеет значение, и в этом случае это значение, которое является ссылкой
  • Ссылка, которая всегда либо нулевой или способ добраться до объекта совместимого типа
  • объектную

Так что, если у вас:

public static final sample s = new sample(); 

Тогда s все равно будет переменная; его значение будет ссылкой на ненулевое значение, которое относится к объекту типа sample.

Придумайте s как, как кусок бумаги, который может быть либо пустым (а null ссылка) или содержать уличный адрес дома. Сам адрес не является домом - это всего лишь способ получить к дому. Там может быть несколько листов бумаги с одним и тем же адресом, написанным на них. Копирование адреса на другой лист бумаги не создает нового дома.

Надеюсь, это поможет.

+1

@HelloWorld: вы не создали объект, и действительно нет такой вещи, как статический объект. Вы объявили переменную, и это не одно и то же. Если вы инициализируете эту переменную значением, отличным от нуля, проблема исчезнет. –

+1

@HelloWorld: Я отредактировал свой ответ, чтобы дать более подробную информацию. –

+0

Привет, Джон, что вы объяснили это правильно. Но мое намерение - вызвать print_fun, используя статический объект, который я создал в тесте класса. Так как я могу это сделать? –

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