Systax错误:“线程中的异常”主“java.lang.NullPointerException”,我该如何解决?

时间:2015-04-17 07:55:10

标签: java nullpointerexception

我正在尝试用java编写游戏2048,现在我只用一行来理解它是如何工作的。运用     HashMap中 和使用     Collection.shuffle 获取随机点位置的方法。当我运行我的代码时,它将随机数放在一个随机点,但我也得到了语法错误,     “线程中的异常”主“java.lang.NullPointerException” 它显示了我的Model类中存在的问题     getValue(int row,int column)     notificationToView() 引用的错误是什么?我该如何解决?

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)); 

}

1 个答案:

答案 0 :(得分:0)

方法

  

public int getValue(int row,int column)

当你return _map.get(new Point(row, column));时 您要求地图获取具有密钥的元素:

  

新点(行,列)

因此地图会查看其键,并调用方法.equals以了解您提供的密钥是否相同。

所以,你似乎用方法中的某些行/列值来调用该方法

在地图中找不到匹配元素并返回 null

由于您的地图包含整数类,并且您的方法签名返回 int ,因此会发生outoboxing并创建nullPointerException,尝试转换 null 到一个int。

所以尝试替换:

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

通过

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