在Java中使用带swing计时器的BufferStrategy时,为什么会出现空指针异常?

在Java中使用带swing计时器的BufferStrategy时,为什么会出现空指针异常?,java,swing,exception-handling,Java,Swing,Exception Handling,为什么下面的代码会出现以下异常 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at java.awt.Component$BltBufferStrategy.showSubRegion(Unknown Source) at java.awt.Component$BltSubRegionBufferStrategy.show(Unknown Source) at javax.swing.BufferStr

为什么下面的代码会出现以下异常

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.awt.Component$BltBufferStrategy.showSubRegion(Unknown Source)
at java.awt.Component$BltSubRegionBufferStrategy.show(Unknown Source)
at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(Unknown Source)
...
它只发生在我每隔一次运行它的时候,但总是在一开始就发生。我正在使用
if(bs.contentLost()){…}
,所以我不明白为什么它会出现问题

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Random;

public class MLM2 extends JFrame implements ActionListener {
    private final Timer timer = new Timer(20, this);
    private Insets insets;
    private BufferStrategy bs;
    private BufferedImage drawing;
    int lastW;
    int lastH;
    int pos = 0;

    public static void main (String[] args) {
        MLM2 ex = new MLM2();
    }

    public void actionPerformed(ActionEvent e) {
        if(bs.contentsLost()) return;
        Graphics2D g = null;
        g = (Graphics2D)bs.getDrawGraphics();
            int w = getWidth() - insets.left - insets.right;
            int h = getHeight() - insets.top - insets.bottom;
            if(w!=lastW || h!=lastH) {
                drawing = (BufferedImage) this.createImage(w,h);
                lastW = w;
                lastH = h;
            }
            Graphics2D drawingBoard = drawing.createGraphics();
            drawingBoard.setColor(Color.PINK);
            drawingBoard.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            drawingBoard.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            drawingBoard.fillRect(0, 0, w, h);

            drawingBoard.setColor(Color.RED);
            drawingBoard.fillRect(pos, 100, 100, 100);

            pos++;
            if(pos>=w) pos=0;

            g.drawImage(drawing, insets.left, insets.top, null);

            drawingBoard.dispose();

            if (!bs.contentsLost()) {
                bs.show();
            }
   }

    public MLM2() {
        super();

        setTitle("Mirror Land");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setSize(800, 420);
        setLocationRelativeTo(null);
        insets = this.getInsets();
        int insetWide = insets.left + insets.right;
        int insetTall = insets.top + insets.bottom;
        setSize(getWidth() + insetWide, getHeight() + insetTall);

        setVisible(true);
        setIgnoreRepaint(true);

        createBufferStrategy(2);
        bs = getBufferStrategy();

        drawing = (BufferedImage) this.createImage(getWidth(),getHeight());

        timer.start();
    }
}

间歇性错误使我担心并发性问题。确保在Swing线程上启动他的应用程序,看看这是否有帮助。在你的主要工作中,做一些

public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
     public void run() {
        MLM2 ex = new MLM2();
     }
  });
}

将Java源代码附加到项目中,以便获得更多详细信息。

我可以很好地编译和运行你的程序。我试了好几次,调整了窗口的大小,最小化和最大化了它,并移动了它。我没有得到任何错误

确保将Java源代码附加到项目中。然后,您可以获得错误的行号,而不是“未知源”。当您查看源代码时,可以看到导致空指针的原因。这将帮助您确定问题所在


仅供参考-我从我的Eclipse开发环境(Indigo SR1)在Red Hat Linux 6.2(圣地亚哥)上以常规模式和调试模式运行它。我使用的是java 1.6.0_23-b05。因此,这可能是特定于您的平台、java版本或您的环境中的任何其他内容。

顺便说一句,不是您的投票人(否则我会提到它以及原因)。