防止NPE:从另一个类访问私有对象

时间:2016-06-19 20:14:33

标签: java nullpointerexception encapsulation

我在一个类中声明了一个私有变量,我想在另一个类中访问。但问题是,当我传递对象flappyBird时,它为空。我需要做出哪些改变,以致它不是?

FlappyBird.java:此处创建的对象

public class FlappyBird implements ActionListener, KeyListener, MouseListener
{

    private static FlappyBird flappyBird;

    public static void main(String[] args)
        /* CREATE INSTANCE OF FLAPPBIRD() */
    {
        flappyBird = new FlappyBird();
    }

    public static FlappyBird getBird() {
        return flappyBird;
    }

    public static void paint(Graphics phics) {
        ...
    }

GraphicRenderer.java:此处访问对象

    public class GraphicsRenderer extends JPanel
    {
        private static FlappyBird bird = new FlappyBird();

    public void paint(Graphics phics)
    {
        // Generate game graphics by calling paint() in FlappyBird.
        bird.getBird();
        super.paint(phics); 
        bird.paint(phics);
    }
}

1 个答案:

答案 0 :(得分:1)

你的班级非常错误。没有吸气剂,许多部件没有意义。以下列出了代码的错误:

  • 没有setter,因此该字段始终为null

  • 出于某种原因,实例化的字段

  • 您没有从您实现的接口实现这些方法。我不会在这里修复,但你自己实现

  • FlappyBird类没有方法paint()。我也不会解决这个问题,因为你可以自己做,而且你没有提供有关方法的任何细节

以下是一些修正:

public class FlappyBird implements ActionListener, KeyListener, MouseListener {

    private static FlappyBird flappyBird;

    public FlappyBird(/* Some attributes to the bird */) {
        /* Field = attribute */
    }

    public static void main(String[] args) {
        flappyBird = new FlappyBird(/* Constructor Args */);
    }

    public FlappyBird getBird() {
        return flappyBird;
    }

    public void setBird(/* You decide the arguments */) {
        /* Field = argument */
    }
}

我添加了一个构造函数,修复了上面的代码,添加了一个setter。构造函数的调用方式如下:

FlappyBird fb = new FlappyBird(arguments);

现在,在调用时,您需要实例化并调用构造函数。然后,您可以访问这些方法。我将getBird()返回值存储在bfb中作为实例。您可以延伸此代码。

public class GraphicsRenderer extends JPanel {

    public void paint(Graphics phics) {
        FlappyBird fb = new FlappyBird(/*Args*/);
        FlappyBird b = fb.getBird();
        fb.setBird(/*Args*/);
    }
}