Java从不同的类调用方法

Java从不同的类调用方法,java,class,methods,Java,Class,Methods,我正在做一些非常基本的编码,试图从不同的类调用一个方法,但出于某种原因,每当我试图从任何不同的类调用任何方法时,我都会得到一个空指针异常。我想我已经正确地创建了类的实例,但是我不确定。如果有人能向我解释到底出了什么问题,我将不胜感激 下面是进行调用的类: public class Menu extends JPanel implements ActionListener{ Skeleton skeleton; Board board; public Menu(){ setBack

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

下面是进行调用的类:

 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”。

当您尝试调用
board.boardTest()时,您的代码似乎会抛出NullPointerException(NPE)
因为您是在将Board对象分配给Board变量之前进行调用,因此对空变量进行方法调用

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

Board board = new Board();
注1:对于将来类似的问题,您将希望向我们显示异常文本,并在代码中通过注释指出引发异常的行。i、 e

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

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

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

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

Board board = new Board();
注1:对于将来类似的问题,您将希望向我们显示异常文本,并在代码中通过注释指出引发异常的行。i、 e

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

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

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

所以

创建新点时,初始坐标将为(0,0)


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

所以

创建新点时,初始坐标将为(0,0)


无论何时调用驻留在其他类中的方法,都必须创建该其他类的对象,然后调用它


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

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

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

Q:“每当我试图从任何不同的类调用任何方法时,我都会得到一个空指针异常”。您是否创建了要调用的类的实例?Q:“每当我尝试从任何不同的类调用任何方法时,都会出现空指针异常。”。您是否创建了要调用的类的实例?