Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义后返回null的Java布尔值_Java_Nullpointerexception - Fatal编程技术网

定义后返回null的Java布尔值

定义后返回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

在看了许多其他类似的问题之后,我似乎仍然有这个问题。似乎是唯一相关的帖子,但它仍然没有回答我的问题。我遇到的问题是,在我的主函数中,我建立了一个布尔值,但在之后调用的函数中,它给了我一个NPE。如图所示:

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 a
    boolean
    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 a
    boolean
    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方法,您可以显式调用该方法来启动游戏。