java – 调用getter时的NullPointerException

我已经对这个问题进行了研究,并试图自己解决这个问题,但没有运气.所以我决定问一下.

基础信息:

有两个班. FBClient和State.在FBClient中,我有一个静态变量,它的类型是fbc,一个StateManager实例,它只有一些方法可以处理State的东西,一些常量和两个getter.在州,我正在尝试初始化BufferedImage.

public class FBClient
{
    //Static
    public static FBClient fbc;

    //In init method
    private StateManager stateManager;

    //Constants
    private final int INIT_FRAME_WIDTH = 320, INIT_FRAME_HEIGHT = (INIT_FRAME_WIDTH / 4) * 3,  SCALE = 3, FRAME_WIDTH = INIT_FRAME_WIDTH * SCALE, FRAME_HEIGHT = INIT_FRAME_HEIGHT * SCALE;

    public static void main(String[] args)
    {
        try
        {
            //First call in exception chain:
            fbc = new FBClient();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.exit(1);
        }
    }

    private FBClient()
        throws IOException
    {
        //Second call in exception chain:
        init();
    }

    private void init()
        throws IOException
    {
        stateManager = new StateManager();
        //Third call in exception chain:
        stateManager.addState(new MainMenu((byte) 0, "Main Menu")); //MainMenu is the subclass of State, and the constructor just calls "super(0, "Main Menu")"
    }

    public int getFRAME_HEIGHT()
    {
        return FRAME_HEIGHT;
    }

    public int getFRAME_WIDTH()
    {
        return FRAME_WIDTH;
    }
}

public abstract class State
{
    protected final byte ID;
    protected final String NAME;
    protected final BufferedImage SCREEN;
    protected final Graphics2D GRAPHICS;

    public State(byte id, String name)
    {
        this.ID = id;
        this.NAME = name;
        //Exception cause:
        this.SCREEN = new BufferedImage(FBClient.fbc.getFRAME_WIDTH(), FBClient.fbc.getFRAME_HEIGHT(), BufferedImage.TYPE_INT_RGB);
        this.GRAPHICS = SCREEN.createGraphics();
    }
}

更多信息:

如果我把文字放在BufferedImage初始化它的工作原理.

如果我在State类中初始化两个变量,为它们分配文字并将这些变量放在初始化中,它就可以工作.

如果不是将文字分配给那些变量,而是将它们分配给FBClient.fbc.getFRAME_WIDTH()和FBClient.fbc.getFRAME_HEIGHT(),它会抛出NullPointerException.

如果我在FBClient类中创建一个System.out.println(getFRAME_WIDTH“:”getFRAME_HEIGHT),它会正确打印出来,但是如果我在State类中执行它(当然在它之前添加FBClient.fbc.)它会抛出一个NullPointerException .

如果我公开FRAME_WIDTH和FRAME_HEIGHT常量,我会尝试从State访问它们
 通过执行FBClient.fbc.FRAME_WIDTH和FRAME_HEIGHT类,它会抛出NullPointerException.

如果我尝试直接从FBClient类访问常量而不是getter,它仍然可以正确打印出来.

最后

感谢您抽出宝贵时间,如果您需要更多信息,请在评论中与我联系,我会提供.此外,如果问题构建不好/没有得到很好的解释,我会道歉.如果是这种情况,请告诉我如何改进它.而且,如果这个问题已被问过并且已经回答过一次,我很抱歉,我可能已经错过了,但正如我所说,我做了我的研究.

编辑#1

评论建议我打印出一个fbc值,看它是否为空.
所以我将这行代码添加到State构造函数中:
if(FBClient.fbc!= null)System.out.println(“Not null”); else System.out.println(“Null”);
并且,如所怀疑的,它打印出null.这是为什么?我在主方法中明确初始化了变量……

解决方法:

您遇到问题的原因是您尝试在其构造函数调用中引用FBClient.fbc,并且该对象尚未完成自己的构造.这并不是很明显你正在做这个,但是如果你按照构造函数中的代码来调用init(),它最终会调用一个State构造函数,而构造函数又会尝试使用FBClient.fbc.getFRAME_WIDTH().

我建议你不要在FBClient构造函数中调用init()并将主方法代码更改为:

    public static void main(String[] args)
    {
        try
        {
          //First call in exception chain:
          fbc = new FBClient();
          fbc.init();
        }
        catch (Exception e)
        {
          e.printStackTrace();
          System.exit(1);
        }

    }

希望这可以帮助.

上一篇:java – 从Eclipse和命令行运行时,BufferedImage字节具有不同的字节顺序


下一篇:java – 尽可能快地获得bufferedimage和bufferedimage部分的平均颜色