2015-04-17 38 views
-4

我想用java編寫遊戲2048,現在我只做一行來理解它是如何工作的。使用 HashMap 並使用 Collection.shuffle 方法獲取隨機點位置。當我運行我的代碼時,它將隨機數放置在一個隨機點中,但我也遇到了語法錯誤, 「線程中的異常」main「java.lang.NullPointerException」 它顯示問題出現在我的Model類中 getValue(int row,int column) notificationToView() 錯誤指的是什麼?我該如何解決它?Systax錯誤:「線程中的異常」main「java.lang.NullPointerException」,我該如何解決它?

import java.util.Random; 
import java.awt.Point; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.ArrayList; 


public class Model { 

    View _view; 

private HashMap<Point, Integer> _map; 

    public Model(){ 
     _map = new HashMap<Point, Integer>(); 

     for(int i = 0; i < 4; i++) 
      _map.put(new Point(0,i), -1); 


} 


/** 
* Assigns randomly generated int values to the 
* variables of the model. 
*/ 
public void notificationToView() { 

     _map.put(getRandomPoint(), getRandom2OR4()); 

    _view.updateView(); 
} 



public int getRandom2OR4(){ 
    Random r = new Random(); 

    if(r.nextInt() % 5 == 0)  
     return 4; 
    else 
     return 2;    
} 

public Point getRandomPoint(){ 
    ArrayList<Point> unoccupied = new ArrayList<Point>(); 

    for (int i = 0; i < 4; i++) 
    { 
     if(_map.get(new Point(0,i)) == -1) 
      unoccupied.add(new Point(0,i)); 
    } 

    Collections.shuffle(unoccupied); 
    Point random = unoccupied.get(0); 

    return random; 
} 

public int getValue(int row, int column) { 
    return _map.get(new Point(row, column)); 
} 


/** 
* Method that associates the a view as an observer 
* of the model. Being an observer implies receiving 
* notifications when the data in the model changes. 
*/ 
public void addObserver(View view) { 
    _view = view; 
} 

} 




public class View implements Runnable { 
    private JFrame _frame; 
    private JPanel _panel; 
    private Model _model; 
    private ArrayList<JButton> _list; 

    public View(Model m){ 
     _model = m; 


    } 

    /** 
    * This method updates the view based on the current 
    * values stored in the data model. 
    */ 
    public void updateView() { 

     for(int i = 0; i < 4; i++){ 
      if(_model.getValue(0,i) != -1) 
       _list.get(i).setText("" + _model.getValue(0, i)); 
      else 
       _list.get(i).setText(""); 
    } 
    } 

    @Override 
    public void run() { 

     _list = new ArrayList<JButton>(); 
     _frame = new JFrame("Lab7"); 
     _panel = new JPanel(); 

     // create 4 buttons 

     for(int i = 0; i < 4; i++){ 

      JButton buttons = new JButton(); 
      _list.add(buttons); 

      _panel.add(_list.get(i)); 

      _list.get(i).setFont(new Font("Georgia", Font.PLAIN,40)); 
      _list.get(i).addKeyListener(new MyKeyEvent(_model)); 

}

+0

從異常堆棧跟蹤,導航到其出現的確切路線 - 這是空指針行 - 檢查未初始化的變量並且可能需要初始化它或在操作之前執行空檢查。 –

+0

異常不是一個語法錯誤,...語法錯誤禁止編譯代碼,所以它永遠不能運行,...在你的情況下運行時發生錯誤時引發異常我懷疑你使用的是NULL的指針意味着你正在訪問地址爲00000000:00000000的存儲器,該存儲器是爲系統保留的,並且你沒有訪問權限......我打賭你在分配之前使用'_map'或者爲NULL對象調用getValue – Spektre

+0

一般爲空指針異常發生在變量未初始化然後被訪問時。編譯器通常會解釋這可能會在適用的情況下顯示錯誤。檢查變量的值。確保它們在pgm中使用之前有一個值。如有必要,在聲明中初始化它們。 – Raj

回答

0

在方法

public int getValue(int row, int column)

當你做return _map.get(new Point(row, column)); 你問的地圖具有鍵獲得要素:

new Point(row, column)

所以在地圖往裏它的密鑰和調用方法.equals來知道你提供的密鑰是否相同。

所以,這似乎是你調用該方法未在地圖上

存在沒有匹配的元素在地圖中找到並返回一些行/列的值。

由於地圖中包含整數類,和你的方法簽名返回INT,outoboxing發生,創造一個NullPointerException,儘量轉換爲int。

所以試圖取代:

return _map.get(new Point(row, column)); 

通過

Integer currentValue = _map.get(new Point(row, column)); 
if (currentValue != null){ 
    return currentValue 
} 
return -1; 
相關問題