2013-03-29 64 views
4

我正在用Java創建視頻遊戲,我試圖檢索座標點列表並將它們繪製到地圖上,但每次運行我的應用程序收到一個「AWT-EventQueue-0」java.lang.NullPointerException,但一直未能弄清楚它爲什麼指向null。以下是錯誤報告中,我得到:「AWT-EventQueue-0」的原因java.lang.NullPointerException錯誤

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at game.PathPoints.drawObjectPath(PathPoints.java:23) 
at game.TestPanel.paintComponent(TestPanel.java:64) 
at javax.swing.JComponent.paint(JComponent.java:1029) 
at javax.swing.JComponent.paintChildren(JComponent.java:866) 
at javax.swing.JComponent.paint(JComponent.java:1038) 
at javax.swing.JLayeredPane.paint(JLayeredPane.java:581) 
at javax.swing.JComponent.paintChildren(JComponent.java:866) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5145) 
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:302) 
at javax.swing.RepaintManager.paint(RepaintManager.java:1216) 
at javax.swing.JComponent.paint(JComponent.java:1015) 
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39) 
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78) 
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115) 
at java.awt.Container.paint(Container.java:1784) 
at javax.swing.RepaintManager$3.run(RepaintManager.java:818) 
at javax.swing.RepaintManager$3.run(RepaintManager.java:795) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:795) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:764) 
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706) 
at javax.swing.RepaintManager.access$1000(RepaintManager.java:61) 
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:673) 
at java.awt.EventQueue.access$300(EventQueue.java:96) 
at java.awt.EventQueue$2.run(EventQueue.java:634) 
at java.awt.EventQueue$2.run(EventQueue.java:632) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:643) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 

錯誤該類PathPoints的代碼如下:

package game; 

    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.util.ArrayList; 
    import java.util.List; 
    import java.util.Scanner; 

    public class PathPoints { 

     public PathPoints (Scanner s){ 
      int numberCoord; 
      List<Coordinates> path = new ArrayList<Coordinates>(); 
      numberCoord = s.nextInt(); 
      for(int x = 0; x < numberCoord; x++){ 
       Coordinates points = new Coordinates(s.nextInt(), s.nextInt()); 
       path.add(points); 
     } 

     } 
     public void drawObjectPath(Graphics g){ 
      g.setColor(Color.GREEN); 
      for(int n = 0; n < path.size()- 1; n++){ 
       g.drawLine(((Coordinates)path.get(n)).x, ((Coordinates)path.get(n)).y, ((Coordinates)path.get(n+1)).x, ((Coordinates)path.get(n+1)).y); 
       g.drawLine(((Coordinates)path.get(n)).x, ((Coordinates)path.get(n)).y+1, ((Coordinates)path.get(n+1)).x, ((Coordinates)path.get(n+1)).y+1); 

    } 
} 

List path; 
}  

該類パ的代碼是在這裏:

public class TestPanel extends JPanel implements MouseListener 
{ 
    private static final long serialVersionUID = 1L; // Ignore this - It's just to get rid of a warning. 

    // Instance variable(s). 
    int x,y; 
    private Image backdrop; 
    PathPoints objectPath; 

    /** 
    * Constructor - loads a background image 
    */ 
    public TestPanel() 
    { 
     try 
     { 
      ClassLoader myLoader = this.getClass().getClassLoader(); 
      InputStream imageStream = myLoader.getResourceAsStream("resources/path_1.jpg"); 
      backdrop = ImageIO.read(imageStream); 
      InputStream pointStream = myLoader.getResourceAsStream("resources/path_1.txt"); 
      Scanner s = new Scanner (pointStream); 
      objectPath = new PathPoints(s); 



     } 
     catch (IOException e) 
     { 
      System.out.println ("Could not load: " + e); 
     } 
     addMouseListener(this); 
    } 



    /** 
    * This paint meethod draws the background image anchored 
    * in the upper-left corner of the panel. 
    */ 
    public void paintComponent (Graphics g) 
    { 
     g.drawImage(backdrop, 0, 0, null); 
     objectPath.drawObjectPath(g); 
     //Coordinates(); 
    } 

我已經測試了PathPoints的構造函數,看看它是否正確地將值添加到ArrayList中,並且它正確地添加它們,那麼我應該看看接下來應該查看哪個部分來解決這個問題?

+0

您是從出側EDT(一些如何)訪問GUI組件。 – Jayan

回答

5
public PathPoints (Scanner s){ 
    int numberCoord; 
    List<Coordinates> path = new ArrayList<Coordinates>(); 
    numberCoord = s.nextInt(); 
    for(int x = 0; x < numberCoord; x++){ 
    Coordinates points = new Coordinates(s.nextInt(), s.nextInt()); 
    path.add(points); 
    } 

在這些線路,「路徑」並不是指你的類的屬性,而是一個區域變量。因此,你的屬性「路徑」永遠不會被初始化。

順便說一句,2個recommandations:

  • 決不名字與你的屬性之一的名稱的變量。
  • 您的屬性應該是私人的:

    private List path;

1

你是shadowing變量path。具有相同名稱的局部變量在構造函數PathPoints的範圍內實例化,但類方法drawObjectPath中的類成員變量pathnull。更換

List<Coordinates> path = new ArrayList<Coordinates>(); 

path = new ArrayList<Coordinates>(); 
1

PathPoints類的構造函數你是一個局部變量隱藏成員變量path

 int numberCoord; 
     List<Coordinates> path = new ArrayList<Coordinates>(); 
     numberCoord = s.nextInt(); 

這意味着成員變量從未分配值,當drawObjectPath方法被調用時將爲null

要解決這個問題,不要隱藏成員變量;使用方法:

 int numberCoord; 
     path = new ArrayList<Coordinates>(); 
     numberCoord = s.nextInt(); 
0
public class StationDatabase1 { 

    File file = new File("lrt.txt"); 


public ArrayList<Station> getAll() throws SQLException, ClassNotFoundException, FileNotFoundException { 
     ArrayList<Station> station = new ArrayList<>(); 
     Scanner input = new Scanner(file); 
     try { 
      while (input.hasNextLine()) { 
       String id = input.nextLine(); 
       String name = input.nextLine(); 
       Station temp = new Station(id, name); 
       station.add(temp); 

       } 
     } catch (Exception ex) { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
     Set newSet = new LinkedHashSet(station); 
     station.clear(); 
     station.addAll(newSet); 
     return station; 
    } 
+0

對於爲什麼你的答案可以解決問題,至少有一個小小的書面解釋可能是件好事。作爲你的答案,我必須做一些閱讀才能理解你的答案 – Crowie

相關問題