我正在做一些非常基本的编码,试图从不同的类调用一个方法,但由于某种原因,每当我尝试从任何不同的类调用任何方法时,我都会得到一个空指针异常。我想我已经正确地创建了类的实例,但我不确定。如果有人能解释我的错误,我会很感激。
这是进行调用的类:
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'。
答案 0 :(得分:8)
当您尝试调用board.boardTest()
时,您的代码看起来应该抛出NullPointerException(NPE),因为您在将Board对象分配给board变量之前进行调用并因此调用方法一个null变量。
您必须先创建一个Board实例,然后才能尝试使用Board变量board。即,
Board board = new Board();
注意1:对于将来的类似问题,您需要向我们展示异常文本,并在代码中通过注释指示哪些行抛出异常。即,
@Override
public void actionPerformed(ActionEvent e) {
board.boardTest(); // **** A NullPOinterException is thrown here ****
}
注意2:这个问题不是Swing特定的,而是一个基本的Java问题 - 在第一次为它指定一个有效的对象之前,不能使用引用变量。
答案 1 :(得分:0)
这不是您创建类实例的方式。 当您在某个类的某个变量上声明时,必须使用新方法。 如果你不这样做,编译器将不知道如何与此相关,因此程序无效,这就是你得到null异常的原因。 你看,当你编写一个程序并尝试启动它时,它首先通过编译器,编译器会检查程序是否有效,如果没有,则会发出警报。 编译器将代码视为长字符串并将其划分为标记。 更简单的是,假设关于某个变量的每个声明都是一个标记,每个关键字也都是标记。变量名称是标识符。 因此,编译器搜索令牌并将数据保存在某些符号表中,并说明什么是类型和什么是值。 例如int num = 3; int是token,num是标识符,3是值,现在编译器将知道要为此分配多少内存。 现在在你的情况下你没有写Board Board = new Board(); 因此,编译器不知道要分配多少空间,也没有对某个实例的引用。所以符号表中的值不是声明的。 这会导致编译器对null异常进行allet。 请注意,某个类的构造函数的另一个角色是初始化某些类字段。 假设您有Point类,并且您希望每次创建新点时,初始x,y将为零。
所以
Class Point{
int x,y;
Point(){
x=y=0;
}
当你创建一个新点时,初始坐标将为(0,0)。
Point p = new Point();
答案 2 :(得分:0)
每当你调用一个驻留在其他类中的方法时,你必须创建另一个类的对象然后调用它。我看到你没有创建该对象。
董事会董事会=新董事会();代码中缺少