Java错误:由于缺少构造函数而导致NullPointerException

时间:2017-11-15 17:19:38

标签: java methods nullpointerexception

我试图访问另一个类中的方法,但是我已经在所述类中有一些构造函数,当我尝试在另一个类中创建一个实例时,它会抛出一个错误。

编辑:我知道我需要填写构造函数,但我不知道该放入什么内容。我在ArrayControl类中创建另一个JFrame还是什么?

这是我运行时遇到的错误:

Exception in thread "main" java.lang.NullPointerException
at Position.ArrayControl.updatePosition(ArrayControl.java:10)
at Display.Display.<init>(Display.java:39)
at Main.Game.<init>(Game.java:19)
at Main.Launch.main(Launch.java:6)

这是错误发生的地方:

public class ArrayControl{
 Display display = new Display(); // Error here asking for a JFrame or String, int, int 

public void updatePosition(String name, int x, int y){
    display.updateGrid(name, x, y, display.getGrid());
    }
}

&#34;显示&#34; I级尝试访问:

public class Display {
public JPanel panel = new JPanel();
public ArrayControl arrayC = new ArrayControl();
public JFrame frame;
JLabel[][] grid= new JLabel[5][5];

public JFrame getFrame() {
    return frame;
}

public Display(JFrame frame){
    this.frame = frame;
}

private String title;
private int width, height;
Color sky = new Color(137, 182, 255);
Color enemyPortal = new Color(154, 91, 193);


//Creating a display function that takes in a title, the width (pixels) and height (pixels)
public Display(String title, int width, int height){
    this.title = title;
    this.width = width;
    this.height = height;

    createDisplay();
    arrayC.updatePosition("Test", 2, 3);
}

我意识到这可能是一个愚蠢的问题,答案在我脸上瞪着我,但所有的帮助都表示赞赏。 谢谢。

5 个答案:

答案 0 :(得分:0)

您创建了一个构造函数

public Display(JFrame frame){ this.frame = frame; }

但在创建显示对象时没有填写构造函数(JFrame)。

答案 1 :(得分:0)

您正在从arrayC.updatePosition的构造函数调用Display,此时arrayC.display仍然是null,因为它应该被分配的实例是,好吧,还在建设中。

答案 2 :(得分:0)

在Java中,只有在未指定其他构造函数的情况下,才会显示默认构造函数(没有任何参数的构造函数)。既然你编写了自己的构造函数:

public Display() { //do nothing or maybe create JFrame here? }

您现在无法调用 new Display()。 你可以:

  1. 在ArrayControl类中创建一个JFrame并调用 new Display(jFrame);
  2. 在Display类中创建一个不带参数的新构造函数:

    {{1}}

答案 3 :(得分:0)

如果在没有声明任何显式构造函数的情况下编写java类,则它具有默认的无参数构造函数。但是,如果至少显式声明了构造函数,则默认情况下不存在无参数构造函数,并且需要时添加。在你的情况下,你有一个Display(String title, int width, int height)构造函数,因此必要时必须明确声明无参数构造函数。

这就是说,你有Display调用arrayC.updatePosition()的构造函数,后者又创建了另一个不同的显示对象。那味道不对劲。我怀疑你想要一个Display个实例。我将创建一个实例化显示的单独方法,然后实例化所有其他需要引用它的对象,并将其作为参数传递给它们的构造函数。

答案 4 :(得分:0)

如您所述,错误发生在您的ArrayControl课程中:

Display display = new Display();

Display没有无参数构造函数。

但是,正如从评论中确定的那样,即使解决这个问题也无法修复您的计划。

目前,您的ArrayControl班正在构建Display的新实例(错误地),并尝试更新您Display字段中存储的display实例ArrayControl课程。这不是您想要做的,而是您想要更新Display实例化ArrayControl对象的实例。

要实现此目的,您需要将Display的当前实例传递给ArrayControl才能使用它。例如(简化):

public class Display {
    private ArrayControl arrayControl;

    public Display() {
        // Pass this instance of Display to ArrayControl to use
        arrayControl = new ArrayControl(this);
        arrayControl.updatePosition("Test", 2, 3);
    }

    public void updateGrid(String name, int x, int y) {
        // Do update grid stuff
    }

}

public class ArrayControl {

    private Display display;

    public ArrayControl(Display display) {
        this.display = display; // assign instance of Display to the field display
    }

    public void updatePosition(String name, int x, int y) {
        display.updateGrid(name, x, y);
        // I'm not sure why you want to pass the display back to the
        // Display class as in your example so I removed it
    }

}

我不确定你的更大目标是什么,以及为什么会有ArrayControl课程。我认为还有更多内容,从问题中移除。