我正在尝试用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));
}
答案 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;