我试图访问另一个类中的方法,但是我已经在所述类中有一些构造函数,当我尝试在另一个类中创建一个实例时,它会抛出一个错误。
编辑:我知道我需要填写构造函数,但我不知道该放入什么内容。我在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);
}
我意识到这可能是一个愚蠢的问题,答案在我脸上瞪着我,但所有的帮助都表示赞赏。 谢谢。
答案 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()。 你可以:
在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
课程。我认为还有更多内容,从问题中移除。