2015-09-21 4 views
4

Я пытаюсь просто расширить абстрактный класс в Java и вызвать несколько методов, хранящихся в нем. Когда я это делаю, я получаю исключение NullPointerException. Я что-то пропустил от абстракции?Java NullPointerException при вызове из абстрактного класса

Это родительский класс:

public abstract class Shape { 
    public Color color; 
    public Point center; 
    public double rotation; 

    public Shape() { 
     Color color = new Color(); 
     Point center = new Point(); 
     rotation = 0.0; 
     System.out.println("shape created"); 
    } 

    public void setLocation(Point p) { center.locationX = p.locationX; center.locationY = p.locationY; } 
    public void setLocation(double x, double y) { center.locationX = x; center.locationY = y; } 

    public abstract double calcArea(); 
    public abstract boolean draw(); 
} 

И дочерний класс:

public class Ellipse extends Shape {   
    public Ellipse() { 
    } 

    public double calcArea() { 
     return 0.0; 
    } 

    public boolean draw() { 
     return true; 
    } 
} 

Вы можете увидеть пункт:

public class Point { 
    public double locationX; 
    public double locationY; 

    public Point() { 
     locationX = 0.0; 
     locationY = 0.0; 
    } 
} 

И, наконец, главная функция:

public class MakeShapes { 
    public static void main(String []args) { 
     Ellipse myShapes = new Ellipse(); 
     myShapes.setLocation(100.0, 100.0); 
    } 
} 

Как только я использую setLocation(), я получаю NPE. Есть предположения? Мой мозг болит, пытаясь понять это. Благодаря!!!

+1

Просьба указать трассировку стека исключения и указать в коде, где она встречается. –

ответ

4

Это тонкая ошибка. Вы создаете локальную center переменную и не присвоив его this.center

public Shape() { 
     Color color = Color.BLACK; 
     Point center = new Point(); 
     rotation = 0.0; 
     System.out.println("shape created"); 
    } 

Измените color и center декларации быть в this.

this.center = new Point()

В конце this.center фактически никогда не определены и, следовательно, NPE.

+0

Ka - ching !!! Да, это сделает. Я так долго смотрел на это ... И, как всегда, это была простая ошибка ... Спасибо !!!! –

8

Проблема здесь состоит в том, что ваш Shape конструктор создает локальную Point ссылку под названием center и что один Настройки инициализации вместо intializing поля (и у вас есть такая же проблема с color). Попробуйте вот так:

public abstract class Shape { 
    public Color color; 
    public Point center; 
    public double rotation; 

    public Shape() { 
     color = new Color(); //changed to intialize the field 
     center = new Point(); //changed to intialize the field 
     rotation = 0.0; 
     System.out.println("shape created"); 
    } 

    public void setLocation(Point p) { center.locationX = p.locationX; center.locationY = p.locationY; } 
    public void setLocation(double x, double y) { center.locationX = x; center.locationY = y; } 

    public abstract double calcArea(); 
    public abstract boolean draw(); 
} 
0

Я согласен с вышесказанным.

Вы создаете экземпляр другого объекта внутри конструктора, который удаляется один раз из области видимости. Итак, вы фактически не устанавливали членов объекта.

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