Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会得到这个NullExceptionError?_Java_Nullpointerexception - Fatal编程技术网

Java 为什么我会得到这个NullExceptionError?

Java 为什么我会得到这个NullExceptionError?,java,nullpointerexception,Java,Nullpointerexception,我一直收到一个空例外错误,但我不知道为什么。我知道,当我引用一个尚未初始化的对象时,会发生这样的错误。在这种情况下,错误显然发生在第二个文件的最后一行(我对该行进行了注释),但我非常确定我已经初始化了该行中的所有内容。。所以我不知道我应该怎么做来修复这个错误 顺便说一下,这些文件编译得很好,只有当我按下左箭头按钮时才会出现错误 public class SnakeGame { JFrame frame; Draw draw; Timer timer; int direction; public

我一直收到一个空例外错误,但我不知道为什么。我知道,当我引用一个尚未初始化的对象时,会发生这样的错误。在这种情况下,错误显然发生在第二个文件的最后一行(我对该行进行了注释),但我非常确定我已经初始化了该行中的所有内容。。所以我不知道我应该怎么做来修复这个错误

顺便说一下,这些文件编译得很好,只有当我按下左箭头按钮时才会出现错误

public class SnakeGame {
JFrame frame;
Draw draw;
Timer timer;
int direction;

public static void main(String[] arg) {
    new SnakeGame();
}

SnakeGame() {
    draw = new Draw();

    frame = new JFrame("Snake");
    frame.add(draw, BorderLayout.CENTER);
    frame.setResizable(false);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.addKeyListener(draw);
    frame.requestFocusInWindow();
}

}
-


如果我看的没错,初始化
蛇形游戏
的唯一方法就是调用
Draw(蛇形游戏蛇形游戏)
,就我所知,它从未被调用过

在你的
SnakeGame
constructor中,你正在调用
newdraw()您可能希望将其更改为新绘图(此)。然后,您还需要在另一个构造函数中调用无参数构造函数
Draw()
,例如
setPreferredSize(新维度(500500))

作为旁注:
Draw
看起来很像一个方法名(这就是为什么我最初认为
Draw()
是一个setter而不是构造函数。如果将类名更改为
DrawPanel
等,也就是说,使用名词作为类名,动词或“命令”作为方法名等,你的生活会更轻松

有关基本命名约定,请参阅这篇维基百科文章:


使用它们可以让你作为程序员的生活变得更轻松,并增加你从其他人那里获得帮助的机会,因为他们更容易理解你的代码。

如果我看得没错,初始化
蛇形游戏的唯一方法就是调用
Draw(蛇形游戏蛇形游戏)
,据我所知,它从来没有被调用过

在您的
SnakeGame
构造函数中,您正在调用
new Draw();
您可能希望将其更改为
new Draw(this);
。然后您还需要在另一个构造函数中的无参数构造函数
Draw()
中进行调用,例如
设置首选大小(新维度(500500));

作为旁注:
Draw
看起来很像一个方法名(这就是为什么我最初认为
Draw()
是一个setter而不是构造函数。如果将类名更改为
DrawPanel
等,也就是说,使用名词作为类名,动词或“命令”作为方法名等,你的生活会更轻松

有关基本命名约定,请参阅这篇维基百科文章:


使用它们可以让你作为程序员的生活变得更轻松,并增加你从其他人那里获得帮助的机会,因为他们更容易理解你的代码。

如果我看得没错,初始化
蛇形游戏的唯一方法就是调用
Draw(蛇形游戏蛇形游戏)
,据我所知,它从来没有被调用过

在您的
SnakeGame
构造函数中,您正在调用
new Draw();
您可能希望将其更改为
new Draw(this);
。然后您还需要在另一个构造函数中的无参数构造函数
Draw()
中进行调用,例如
设置首选大小(新维度(500500));

作为旁注:
Draw
看起来很像一个方法名(这就是为什么我最初认为
Draw()
是一个setter而不是构造函数。如果将类名更改为
DrawPanel
等,也就是说,使用名词作为类名,动词或“命令”作为方法名等,你的生活会更轻松

有关基本命名约定,请参阅这篇维基百科文章:


使用它们可以让你作为程序员的生活变得更轻松,并增加你从其他人那里获得帮助的机会,因为他们更容易理解你的代码。

如果我看得没错,初始化
蛇形游戏的唯一方法就是调用
Draw(蛇形游戏蛇形游戏)
,据我所知,它从来没有被调用过

在您的
SnakeGame
构造函数中,您正在调用
new Draw();
您可能希望将其更改为
new Draw(this);
。然后您还需要在另一个构造函数中的无参数构造函数
Draw()
中进行调用,例如
设置首选大小(新维度(500500));

作为旁注:
Draw
看起来很像一个方法名(这就是为什么我最初认为
Draw()
是一个setter而不是构造函数。如果将类名更改为
DrawPanel
等,也就是说,使用名词作为类名,动词或“命令”作为方法名等,你的生活会更轻松

有关基本命名约定,请参阅这篇维基百科文章:


使用这些工具可以让你的程序员生活更轻松,并增加你从他人那里获得帮助的机会,因为他们更容易理解你的代码。

你从未初始化过
snakeGame;
因此
snakeGame==null
。你需要在默认构造函数中初始化它,如
snakeGame snakeGame=new SnakeGame()


我也很好奇为什么
SnakeGame
Draw
都是私有成员。

您从未初始化过
SnakeGame;
因此
SnakeGame==null
。您需要在默认构造函数中初始化它,如
SnakeGame SnakeGame=new Snakeggame()


我也很好奇为什么
SnakeGame
Draw
都是私有成员。

您从未初始化过
SnakeGame;
因此
SnakeGame==null
。您需要在默认构造函数中初始化它,如
SnakeGame SnakeGame=new Snakeggame()


我也很好奇为什么
SnakeGame
Draw
都是私有成员。

您从未初始化过
SnakeGame;
因此
SnakeGame==null
。您需要在默认构造函数中初始化它,如
SnakeGame SnakeGame=new Snakeggame()
public class Draw extends JPanel implements ActionListener, KeyListener {
SnakeGame snakeGame;
public Draw(SnakeGame snakeGame) {
    this.snakeGame = snakeGame;
}

public Draw() {
    setPreferredSize(new Dimension(500,500));
    setBackground(Color.BLACK);
    setFocusable(true);
}

@Override
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if(key == KeyEvent.VK_LEFT){
        System.out.println("left pressed");
        setDirection(1);
    } else if (key == KeyEvent.VK_RIGHT) {
        System.out.println("right pressed");
    } else if (key == KeyEvent.VK_UP) {
        System.out.println("UP pressed");
    } else if (key == KeyEvent.VK_DOWN) {
        System.out.println("down pressed");
    }
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyTyped(KeyEvent e){
}

public int getDirection(){
   return snakeGame.direction;
}

public void setDirection(int dir){
    snakeGame.direction = dir;  //According to the compiler the error occurs here
    System.out.println(snakeGame.direction);
}

}