1

我正在做一些非常基本的编码,试图从不同的类中调用一个方法,但由于某种原因,每当我尝试从任何不同的类中调用任何方法时,我都会得到一个空指针异常。我想我已经正确地创建了类的实例,但我不确定。如果有人可以向我解释发生了什么问题,我将不胜感激。

这是进行调用的类:

 public class Menu extends JPanel implements ActionListener{

Skeleton skeleton;
Board board;

public Menu(){

    setBackground(Color.BLACK);

    JButton button = new JButton("hello");  
    button.addActionListener(this);
    this.add(button);
}

public JPanel getPanel(){
    return this;
}

@Override
public void actionPerformed(ActionEvent e) {
    board.boardTest();
}
}

这是包含该方法的类

public class Board extends JPanel{

public Board(){
setBackground(Color.WHITE);
}

public JPanel getPanel(){
    return this;
}

public void boardTest(){
    System.out.print("hello");
}
}

如您所见,每当用户单击按钮时,它应该打印出“hello”。

4

3 回答 3

8

当您尝试调用时,您的代码看起来好像应该抛出 NullPointerException (NPE),board.boardTest()因为您在将 Board 对象分配给 board 变量之前进行调用,因此对空变量进行方法调用。

您必须先创建一个 Board 实例,然后才能尝试使用 Board 变量 board。IE,

Board board = new Board();

注意 1:对于将来的类似问题,您将希望向我们展示异常文本并在代码中通过注释指出哪些行引发了异常。IE,

@Override
public void actionPerformed(ActionEvent e) {
    board.boardTest();  // **** A NullPOinterException is thrown here ****
}

注意 2:这个问题不是 Swing 特定的,而是一个基本的 Java 问题——在您首先为其分配一个有效对象之前,您不能使用引用变量。

于 2013-07-21T20:50:38.900 回答
0

这不是您创建类实例的方式。当您在某个类的某个变量上声明时,您必须使用新方法。如果你不这样做,编译器将不知道如何与此相关,因此程序无效,这就是你得到空异常的原因。你看,当你编写一个程序并尝试启动它时,它首先通过编译器,编译器检查程序是否有效,如果不是,则发出警报。编译器将代码视为一个长字符串并将其划分为标记。更简单地说,假设某个变量的每个声明都是一个标记,每个关键字也是一个标记。变量名是标识符。因此编译器搜索标记并将数据保存在一些符号表中,并说明什么是类型,什么是值。例如 int num =3; int 是令牌,num 是标识符,3 是值,现在编译器将知道为此分配多少内存。现在在你的情况下,你没有写 Board board = new Board(); 因此,编译器不知道要分配多少空间,也没有对某个实例的引用。所以符号表中的值没有被声明。这会导致编译器提示空异常。注意一些类的构造函数的另一个作用是初始化一些类的字段。假设您有 Point 类,并且您希望每次创建新点时初始 x,y 都为零。所以符号表中的值没有被声明。这会导致编译器提示空异常。注意一些类的构造函数的另一个作用是初始化一些类的字段。假设您有 Point 类,并且您希望每次创建新点时初始 x,y 都为零。所以符号表中的值没有被声明。这会导致编译器提示空异常。注意一些类的构造函数的另一个作用是初始化一些类的字段。假设您有 Point 类,并且您希望每次创建新点时初始 x,y 都为零。

所以

Class Point{
int x,y;
 Point(){
    x=y=0;
}

当您创建一个新点时,初始坐标将为 (0,0)。

Point p = new Point();
于 2013-07-21T21:30:02.387 回答
0

每当您调用驻留在某个其他类中的方法时,您必须创建该其他类的对象然后调用它。在这里我看到您还没有创建该对象。

板板 = 新板();代码中缺少

于 2013-08-21T05:25:24.943 回答