2015-05-04 4 views
0

Я продолжаю получать исключение NullPointerException, когда хочу нарисовать объект polygon Pizza. Я получаю это сообщение об ошибке:Драйвер Java JFrame/Graphics

Exception in thread "main" java.lang.NullPointerException 
    at Pizza.<init>(Pizza.java:9) 
    at PolyDemo$PolyDemoPanel.getRandShape(PolyDemo.java:91) 
    at PolyDemo$PolyDemoPanel.<init>(PolyDemo.java:54) 
    at PolyDemo.<init>(PolyDemo.java:19) 
    at PolyDemo.main(PolyDemo.java:28) 

У меня не было проблем с кругами и прямоугольниками, почему это не работает? Вот моя пицца класс:

import java.awt.*; 

    public class Pizza extends Shape{ 
     private Polygon P; 

     public Pizza(int x, int y) { 
      super(x,y); 
      P.xpoints = new int[]{x, x+100, x+200}; 
      P.ypoints = new int[]{y, y+100, y}; 
      P.npoints = 3; 
     } 

     @Override 
     public void draw(Graphics g){ 
      g.setColor(Color.RED); 
      g.drawPolygon(P); 
     } 
    } 

Здесь водитель:

import java.util.*; 
    import java.awt.*; 
    import javax.swing.*; 

    class PolyDemo extends JFrame { 
     public PolyDemo() { 
      getContentPane().add(new PolyDemoPanel()); 
      setSize(300,300); 
      setVisible(true); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     } 
    public static void main(String args[]) { 
     PolyDemo myApp = new PolyDemo(); 
    } 
    public class PolyDemoPanel extends JPanel {  
     Shape[] myShapes= new Shape[20]; 

     public PolyDemoPanel() { 
      for(int i = 0; i < 20; i++) { 
       myShapes[i] = getRandShape(); 
      } 
     } 
     public void paint(Graphics g) { 
      super.paint(g); 

      for(int i = 0; i < myShapes.length; i++){ 
       myShapes[i].draw(g); 
      } 
     } 
     public int getRandInt() { 
      return ((int) (Math.random() * 200)); 
     } 
     public Shape getRandShape() { 
      Shape retVal = null; 
      final int x = getRandInt(); 
      final int y = getRandInt(); 
       retVal = new Pizza(x, y); 
       return retVal; 
      } 
     } 
    } 
+0

Примечание: не называйте Polyingon 'P'. Только имена типов должны иметь заглавную букву в начале (а константы - все-шапки). Поля, локальные переменные и методы должны начинаться с строчной буквы. – RealSkeptic

+0

Возможно, вам стоит взглянуть на [Работа с геометрией] (https://docs.oracle.com/javase/tutorial/2d/geometry/index.html) – MadProgrammer

ответ

2

Вы объявляете Полигон, но не создает объект. Таким образом, это значение равно null, когда вы используете его в конструкторе Pizza. Вам нужно будет создать экземпляр, прежде чем использовать его в конструкторе. Также P является плохим именем для переменной

public Pizza(int x, int y) { 
     super(x,y); 
     //P is null here - add P=new Poligon() 
     P.xpoints = new int[]{x, x+100, x+200}; 
     P.ypoints = new int[]{y, y+100, y}; 
     P.npoints = 3; 
    } 
0

Вы не инициализировать Polygon поле P. Попробуйте это:

public Pizza(int x, int y) { 
    super(x,y); 
    P = new Polygon(); 
    P.xpoints = new int[]{x, x+100, x+200}; 
    P.ypoints = new int[]{y, y+100, y}; 
    P.npoints = 3; 
}