【问题标题】:Array returning NullPointerException [duplicate]返回 NullPointerException 的数组 [重复]
【发布时间】:2016-03-06 10:37:42
【问题描述】:

我一直在创建一个包含 Segments 数组的 Snakes 程序。在这种情况下,我认为使用数组作为顺序很重要。第一个问题是,即使我创建了一个“新的Segment 实例”,它也不会显示任何正方形(这是蛇的第一段)。但是,当我将System.out.println() 语句放入paint 方法(稍后显示)时,它会抛出NullPointerException。代码如下:

注意:方法increaseSegmentCount() 曾从外部类调用一次。另外,这不是完整的代码...

import java.awt.Graphics;
import java.awt.Point;

public class Snake implements Entity {
    Point location;
    Segment[] segments;
    int segmentCount = 0;

    public Snake(Point location) {
        this.location = location;
        segments = new Segment[25];
    }

    public void increaseSegmentCount() {

        segments[segmentCount] = new Segment(new Point(location.x + (Segment.getSize().width * segments.length),
                location.y + (Segment.getSize().height * segments.length)));

        segmentCount++;

    }

    public Segment[] getSegments() {
        return segments;
    }

    public int getSegmentCount() {
        return segmentCount;
    }

    @Override
    public void paint(Graphics g) {
        for (Segment segment : segments) {
            if (segment != null)
                segment.paint(g);
        }
    }
}

System.out.println语句放入后的paint()方法:

@Override
    public void paint(Graphics g) {
        for (Segment segment : segments) {
            if (segment != null)
                System.out.println("Called")
                segment.paint(g);
        }
    }

Segment 类(非常简单的类)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;

public class Segment {
    Point location;

    public Segment(Point location) {
        this.location = location;
    }

    public static Dimension getSize() {
        return new Dimension(20, 20);
    }

    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(location.x, location.y, 20, 20);
    }
}

View 类中的paintComponent() 方法(用于调试目的)

@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Entity entity : model.getEntities()) {
            entity.paint(g);
        }
    }

最后是错误(插入打印语句后......在我插入之前没有):

Called
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Snake.paint(Snake.java:61)
    at View.paintComponent(View.java:50)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent._paintImmediately(Unknown Source)
    at javax.swing.JComponent.paintImmediately(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at javax.swing.RepaintManager$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1200(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

有什么想法吗?另外,请不要将其标记为重复,并指向另一篇展示如何解决 NPE 的帖子......我已经知道该怎么做以及发生了什么(大部分情况下),但这是一件奇怪的事情我遇到过,非常混乱。谢谢。

【问题讨论】:

    标签: java arrays nullpointerexception


    【解决方案1】:

    当你添加 print 语句时,你需要 { } 作为你的 if...

    if (segment != null) {
                System.out.println("Called")
                segment.paint(g);
    }
    

    您可能会考虑使用自动代码格式化程序,这将使缩进变得明显。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2020-10-11
      • 2018-06-21
      • 2013-01-02
      • 2016-12-06
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多