2015-07-09 3 views
1

im new для Java. Я нашел этот пример в книге. Я ожидал, что он напечатает «ab» или «abc», но вместо этого он выдает исключение. Может ли кто-нибудь объяснить, почему это происходит? Заранее спасибо.Почему этот код генерирует исключение NullPointerException?

public class Test { 
    class A { 
     String str = "ab"; 

     A() { 
      printLength(); 
     } 

     void printLength() { 
      System.out.println(str.length()); 
     } 
    } 

    class B extends A { 
     String str = "abc"; 

     void printLength() { 
      System.out.println(str.length()); 
     } 
    } 

    public static void main(String[] args) { 
     new Test().new B(); 
    } 
} 

Вот исключение

Exception in thread "main" java.lang.NullPointerException 
    at c.Test$B.printLength(Test.java:25) 
    at c.Test$A.<init>(Test.java:13) 
    at c.Test$B.<init>(Test.java:21) 
    at c.Test.main(Test.java:30) 
+3

Каждое исключение должно иметь stacktrace. Пожалуйста, опубликуйте его. –

+0

новый тест(). Новый B(); это правильно.? – Saif

ответ

4

A построен до того B. В конструкторе A вы вызываете printLength, который переопределяется в классе B. Но str в классе B еще не был создан, и будет null.

Поэтому вы получаете исключение Null Pointer.

+0

Просто любопытно, не есть ли также «str'? Тогда почему NPE? –

+0

Поскольку переопределенный метод называется предпочтительным. (Обратите внимание, что в C++ поведение не определено.) –

+0

Могу ли я изменить код, чтобы он использовал поле str из класса A? –

0

См ошибка в

A() { 
     printLength();   
    } 

Как, когда вы делаете новый B(), то в качестве B является подклассом множества А поэтому А() будет называться первым оператором B(), который по умолчанию в ваш случай В A() вы пытаетесь получить доступ к str класса B, но фаза инициализации еще не завершена, так как выполняемый конструктор B() еще выполнен. Ошибка.

Надеюсь, что смогу помочь. Не пытайтесь запустить выполнение из конструктора, поскольку он предназначен для инициализации ваших атрибутов.

Спасибо.

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