我想用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));
}
從異常堆棧跟蹤,導航到其出現的確切路線 - 這是空指針行 - 檢查未初始化的變量並且可能需要初始化它或在操作之前執行空檢查。 –
異常不是一個語法錯誤,...語法錯誤禁止編譯代碼,所以它永遠不能運行,...在你的情況下運行時發生錯誤時引發異常我懷疑你使用的是NULL的指針意味着你正在訪問地址爲00000000:00000000的存儲器,該存儲器是爲系統保留的,並且你沒有訪問權限......我打賭你在分配之前使用'_map'或者爲NULL對象調用getValue – Spektre
一般爲空指針異常發生在變量未初始化然後被訪問時。編譯器通常會解釋這可能會在適用的情況下顯示錯誤。檢查變量的值。確保它們在pgm中使用之前有一個值。如有必要,在聲明中初始化它們。 – Raj