Systax错误:“;“线程中的异常”;“主要”;java.lang.NullPointerException“;,我怎样才能修好它?
我正在尝试用java编写游戏2048,现在我只写了一行来理解它是如何工作的。使用 哈希图 和使用 洗牌 方法得到随机点的位置。当我运行代码时,它将随机数放在一个随机点上,但我也得到了语法错误, 线程“main”java.lang.NullPointerException中出现异常 这表明问题在我的模型课上 getValue(int行,int列) notificationToView() 错误指的是什么?我怎样才能修好它Systax错误:“;“线程中的异常”;“主要”;java.lang.NullPointerException“;,我怎样才能修好它?,java,nullpointerexception,Java,Nullpointerexception,我正在尝试用java编写游戏2048,现在我只写了一行来理解它是如何工作的。使用 哈希图 和使用 洗牌 方法得到随机点的位置。当我运行代码时,它将随机数放在一个随机点上,但我也得到了语法错误, 线程“main”java.lang.NullPointerException中出现异常 这表明问题在我的模型课上 getValue(int行,int列) notificationToView() 错误指的是什么?我怎样才能修好它 import java.util.Random; import java.a
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));
import java.util.Random;
导入java.awt.Point;
导入java.util.Collections;
导入java.util.HashMap;
导入java.util.ArrayList;
公共类模型{
视图(u视图),;
私有HashMap\u映射;
公共模型(){
_map=新的HashMap();
对于(int i=0;i<4;i++)
_地图放置(新点(0,i),-1);
}
/**
*将随机生成的int值分配给
*模型的变量。
*/
public void notificationToView(){
_put(getRandomPoint(),getRandom2OR4());
_view.updateView();
}
public int getRandom2OR4(){
随机r=新随机();
if(r.nextInt()%5==0)
返回4;
其他的
返回2;
}
公共点getRandomPoint(){
ArrayList unoccubied=新建ArrayList();
对于(int i=0;i<4;i++)
{
if(_map.get(新点(0,i))=-1)
未占用。添加(新点(0,i));
}
收藏。洗牌(未占用);
点随机=未占用。获取(0);
返回随机;
}
公共int getValue(int行,int列){
返回_map.get(新点(行、列));
}
/**
*将视图关联为观察者的方法
*作为一个观察者意味着接受
*模型中的数据更改时的通知。
*/
公共void addObserver(视图){
_视图=视图;
}
}
公共类视图实现可运行{
私有JFrame _帧;
私人JPanel_小组;
私有模型(u模型),;
私有数组列表;
公众视野(m型){
_模型=m;
}
/**
*此方法基于当前视图更新视图
*存储在数据模型中的值。
*/
public void updateView(){
对于(int i=0;i<4;i++){
if(_model.getValue(0,i)!=-1)
_list.get(i.setText(“+_model.getValue(0,i));
其他的
_list.get(i).setText(“”);
}
}
@凌驾
公开募捐{
_列表=新的ArrayList();
_框架=新的JFrame(“Lab7”);
_panel=新的JPanel();
//创建4个按钮
对于(int i=0;i<4;i++){
JButton buttons=新JButton();
_列表。添加(按钮);
_panel.add(_list.get(i));
_list.get(i).setFont(新字体(“乔治亚”,普通字体,40));
_list.get(i).addKeyListener(新的MyKeyEvent(_模型));
}在方法中
公共int getValue(int行,int列)
执行return\u map.get(新点(行、列));
您要求映射获取具有键的元素:
新点(行、列)
因此,映射查看其键的内部,并调用method.equals以知道您提供的键是否相同
因此,似乎您使用一些映射中不存在的行/列值调用该方法
在映射中找不到匹配元素,返回null
由于您的映射包含整数类,并且您的方法签名返回一个int,因此会发生outoboxing并创建一个nullPointerException,请尝试将null转换为int
因此,尝试替换:
return _map.get(new Point(row, column));
借
从异常堆栈跟踪,导航到其出现的确切行-即指针为空的行-检查未初始化的变量,可能需要在操作之前对其进行初始化或执行空检查。异常不是语法错误,…语法错误禁止您编译代码,使其永远无法运行,…异常是在您的情况下,当运行时发生错误时抛出。我怀疑您使用的指针为NULL,这意味着您正在访问为系统保留的地址00000000:00000000处的内存,并且您没有对该地址的访问权限……我打赌您在分配之前正在使用
\u map
,或者为NULL objectGeneral调用getValue未初始化并访问变量时会发生ly Null指针异常。编译器通常会解释这种情况,并在适用的情况下显示错误。请检查变量的值。在pgm中使用变量之前,确保它们具有值。如有必要,请在声明时对其进行初始化。
Integer currentValue = _map.get(new Point(row, column));
if (currentValue != null){
return currentValue
}
return -1;