定义后返回null的Java布尔值
在看了许多其他类似的问题之后,我似乎仍然有这个问题。似乎是唯一相关的帖子,但它仍然没有回答我的问题。我遇到的问题是,在我的主函数中,我建立了一个布尔值,但在之后调用的函数中,它给了我一个NPE。如图所示:定义后返回null的Java布尔值,java,nullpointerexception,Java,Nullpointerexception,在看了许多其他类似的问题之后,我似乎仍然有这个问题。似乎是唯一相关的帖子,但它仍然没有回答我的问题。我遇到的问题是,在我的主函数中,我建立了一个布尔值,但在之后调用的函数中,它给了我一个NPE。如图所示: public class Display extends JFrame { private static final long serialVersionUID = 1L; public JPanel gp = (JPanel) getGlassPane(); public Images i
public class Display extends JFrame {
private static final long serialVersionUID = 1L;
public JPanel gp = (JPanel) getGlassPane();
public Images i;
public ActualGameClass p;
public Draw d;
public Controls c;
public boolean AllLoaded = false;
public Display(){
i = new Images();
gp.setVisible(true);
c = new Controls(this, d);
c.loadControls();
p = new ActualGameClass();
d = new Draw(p, i);
i.loadImages();
System.out.println(c.ControlsLoaded);
AllLoaded = true;
gp.setLayout(new GridLayout(1, 1, 0, 0));
this.setLayout(new GridLayout(1, 1, 0, 0));
gp.add(d, p);
this.add(i);
p.Game();
}
然后在类ActualGameClass.java中
public void Game(){
if(Main.f.AllLoaded){
//game
}
}
当我运行此代码时,它会将我指向
if(Main.f.AllLoaded)
说有一个NPE
因为它是被请求的,我在评论中的格式设置有问题:
Main正是我用来在JFrame中设置窗口的,下面是相关的类
public class Main {
public static Display f = new Display();
public static int w =
Main.f.ResChoiceW + 0;
public static int h =
Main.f.ResChoiceH +22; //Top Bar of GP renders as 22px
public static void main(String args[]){
f.setSize(w, h);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setTitle("Eddy's Adventures");
f.setLocationRelativeTo(null);
f.setAlwaysOnTop(false);
}
还有Stacktrace
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at com.fireFlower.pasterino.ActualGameClass.Game(ActualGameClass.java:24)
at com.fireFlower.pasterino.Display.<init>(Display.java:31)
at com.fireFlower.pasterino.Main.<clinit>(Main.java:7)
线程“main”java.lang.ExceptionInInitializeError中的异常
原因:java.lang.NullPointerException
在com.fireFlower.pasterino.ActualGameClass.Game上(ActualGameClass.java:24)
在com.fireFlower.pasterino.Display.(Display.java:31)
位于com.fireFlower.pasterino.Main.(Main.java:7)
因为您正在运行
p.Game()代码>在显示
构造函数中,如果引用的变量也在显示
的构造函数中赋值,则将引用未完全构造的显示
对象
这应该有助于理解:因为您正在运行p.Game()代码>在显示
构造函数中,如果引用的变量也在显示
的构造函数中赋值,则将引用未完全构造的显示
对象
这有助于理解:继续@JustinJasmann的回答:
消除对Display
构造函数中p.Game()
的调用。除非您真的知道自己在做什么,否则应该避免递归调用
完全消除AllLoaded
变量
将void Game()
更改为void Game(Display disp)
我想,作为主菜单的最后一行,请调用Game(f)
考虑将变量命名为对它们的指示,并遵循命名约定:
f --> disp
void Game --> void startGame //Functions should start with lowercase.
w --> resNum ??
h --> resNumH
依此类推。继续@JustinJasmann的回答:
消除对Display
构造函数中p.Game()
的调用。除非您真的知道自己在做什么,否则应该避免递归调用
完全消除AllLoaded
变量
将void Game()
更改为void Game(Display disp)
我想,作为主菜单的最后一行,请调用Game(f)
考虑将变量命名为对它们的指示,并遵循命名约定:
f --> disp
void Game --> void startGame //Functions should start with lowercase.
w --> resNum ??
h --> resNumH
等等。什么是.f
以及Main
在哪里?另外,显示stacktrace。如果不是太大,请发布整个类。这不足以回答您的问题。@user3386026 aboolean
can;t应该是null
,但是Main.f
可能是。您可以将范围缩小到Main是null还是f是null。如果您不能使用IDE来判断,那么在出现问题的行之前插入System.out.println(“Main==null是”+(Main==null));System.out.println(“f==null是”+(Main.f==null))@总的来说,我添加了整个类什么是.f
以及Main
在哪里?另外,显示stacktrace。如果不是太大,请发布整个类。这不足以回答您的问题。@user3386026 aboolean
can;t应该是null
,但是Main.f
可能是。您可以将范围缩小到Main是null还是f是null。如果您不能使用IDE来判断,那么在出现问题的行之前插入System.out.println(“Main==null是”+(Main==null));System.out.println(“f==null是”+(Main.f==null))@总之,我添加了整个类。既然我想运行“p.Game()”,但每当我试图用函数调用它时,它还没有被构造出来,你建议我如何解决这个问题。你能详细说明显示
对象是如何不完整的吗?由于p.Game()
是构造函数中的最后一行代码,我不明白这怎么会是个问题。递归调用自身(Display-->Game-->Display)不是一个好主意,但我不明白它是如何破坏事物的。不要怀疑你的答案,只是不理解它。@alitermind只是看看链接。它围绕着对共享对象的多线程访问展开,它们在解释方面比我做得更好。@user3386026更好的设计是完全删除布尔值,并添加一个delegator方法,您可以显式调用该方法来启动游戏。既然我要“p.game(),您建议我如何解决此问题'要运行,但任何时候我试图用函数调用它时,它还没有被构造。你能详细说明Display
对象是如何不完整的吗?由于p.Game()
是构造函数中的最后一行代码,我不明白这怎么会是个问题。递归调用自身(Display-->Game-->Display)不是一个好主意,但我不明白它是如何破坏事物的。不要怀疑你的答案,只是不理解它。@alitermind只是看看链接。它围绕着对共享对象的多线程访问展开,它们在解释方面比我做得更好。@user3386026更好的设计是完全删除布尔值并添加一个delegator方法,您可以显式调用该方法来启动游戏。