2013-04-14 71 views
-1

目前我嘗試做一盤棋。這是主類,它調用一個JPanel子類,在其上繪製數字。如何避免初始繪製組件時出現NullPointerException?

package schach; 

public class schach extends JFrame { 

    private SpielFeld spiel = new SpielFeld(); 

    public schach(String title) { 

    Container cp = getContentPane(); 
    cp.add(spiel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
    new schach("Schach"); 
    } 
} 

然後繼續施皮爾費爾德,JPanel的子類,這是應該人物畫和董事會:

package schach; 

public class SpielFeld extends JPanel { 

    private Image brettimg =  new ImageIcon("schach\\sprites\\brett.png").getImage(); 
    private Image bauerWimg = new ImageIcon("schach\\sprites\\bauerW.png").getImage(); 

    private ArrayList<Figur> figuren = new ArrayList<Figur>(); 

    private Bauer bauerW1 = new Bauer(6, 0); 

    public SpielFeld() { 
    figuren.add(bauerW1); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

    g.drawImage(brettimg, 0, 0, null); 

    for (int i=0; i<figuren.size(); i++) { 
     g.drawImage(bauerWimg, (int) figuren.get(i).getPoint().getX()*64, (int) figuren.get(i).getPoint().getY()*64, null); 
    }  
    } 
} 

現在我得到一個NullPointerException。我認爲這是由於創建「spiel」的順序,調用paintComponent(默認情況下,uppon將JFrame添加到ContentPane或其他東西?)以及創建並填充ArrayListed。我試圖發表評論,看看它是如何工作的,但似乎無法弄清楚。它是如何工作的,我該如何解決這個問題?我試圖刪除希望不重要的東西。

Figur.java

package schach; 

public class Figur { 

    Point posi; 

    public Figur(int x, int y) { 
    posi.setLocation(x, y); 
    } 

    public Point getPoint() { 
    return posi; 
    } 
} 

Bauer.java

package schach; 

public class Bauer extends Figur { 

    boolean zug = false; 

    public Bauer(int x, int y) { 
    super(x, y); 
    } 
} 

@skirsch 這?

Exception in thread "main" java.lang.NullPointerException 
    at schach.Figur.<init>(Figur.java:10) 
    at schach.Bauer.<init>(Bauer.java:8) 
    at schach.SpielFeld.<init>(SpielFeld.java:29) 
    at schach.schach.<init>(schach.java:10) 
    at schach.schach.main(schach.java:31) 
+0

請提供異常的堆棧跟蹤 – skirsch

+1

嗯...我最近沒看過這個確切的代碼嗎?相同的課程......?無論如何,請學習java命名約定並堅持下去。 – kleopatra

+0

1)測試圖像是否加載。 2)學習使用調試器並逐步完成代碼。 3)爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

0

在類Figur中,Point posi未初始化,因此爲null。 通過

public Figur(int x, int y) { 
    posi = new Point(x, y); 
} 

替換

public Figur(int x, int y) { 
    posi.setLocation(x, y); 
} 

消除空指針異常。

+0

是的,現在發現我自己,但非常感謝你:)你能解釋我什麼時候需要「=新......」嗎?當我創建類的實例與簡單字段(我認爲他們被稱爲那樣?)? – user2247969

+0

如果你想要一個類的實例,例如必須是一個初始化對象作爲一個實例。默認情況下,只要沒有使用_new_實例化,所有記錄的對象(即Object的子類)都是空的。 –

相關問題