簡體   English   中英

為什么在 Java 中使用帶有 swing 計時器的 BufferStrategy 時出現此 null 指針異常?

[英]Why this null pointer exception when using BufferStrategy with swing timer in Java?

為什么使用以下代碼可能會出現以下異常?

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 源代碼附加到您的項目中,以便您獲得更多詳細信息。

我能夠很好地編譯和運行你的程序。 我嘗試了幾次,調整了 window 的大小,最小化和最大化它,然后移動它。 我無法得到任何錯誤。

確保將 Java 源代碼附加到您的項目中。 然后,您可以獲得錯誤的行號,而不是“未知來源”。 查看源代碼時,您可以看到導致 null 指針的原因。 這將幫助您確定問題所在。

僅供參考 - 我在 Red Hat Linux 6.2 (Santiago) 上以常規和調試模式從我的 Eclipse 開發環境 (Indigo SR1) 運行它。 我正在使用 java 1.6.0_23-b05。 所以這可能是特定於您的平台、您的 java 版本或您環境中的任何其他內容。

我們在 Swing 應用程序中遇到了完全相同的問題,該應用程序在全球數萬台機器上 24/7 全天候運行,每月運行幾次。 所以這對我們來說很少發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM