[英]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.