getGraphics() 上的空指针异常
Posted
技术标签:
【中文标题】getGraphics() 上的空指针异常【英文标题】:Null Pointer Exception on getGraphics() 【发布时间】:2021-12-30 21:49:31 【问题描述】:我的应用程序看起来像这样,我在 draw() 方法中得到一个空指针异常,确切地说是 g.drawImage(img, 0, 0, null)
package com.ochs.game;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JPanel implements Runnable
private static final long serialVersionUID = 8229934361462702491L;
public static final int WIDTH = 320;
public static final int HEIGHT = 240;
public static final int SCALE = 2;
public boolean isRunning;
private BufferedImage img;
private Graphics2D g2d;
public Game()
setFocusable(true);
requestFocus();
start();
public void start()
isRunning = true;
new Thread(this).start();
public void stop()
isRunning = false;
public void run()
long start;
init();
while(isRunning)
start = System.currentTimeMillis();
update();
render();
draw();
try
Thread.sleep(5 - (System.currentTimeMillis() - start));
catch (Exception e)
public void init()
img = new BufferedImage(WIDTH*SCALE, HEIGHT*SCALE, BufferedImage.TYPE_INT_RGB);
g2d = (Graphics2D) img.getGraphics();
public void update()
public void render()
public void draw()
Graphics g = getGraphics();
g.drawImage(img, 0, 0, null); // <<<<< getting null pointer here!
public static void main(String[] args)
Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE);
Game gameComponent = new Game();
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(size);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(gameComponent);
现在我的问题是:为什么在尝试绘制名为 img 的缓冲图像时会出现空指针异常?我也尝试使用 drawString() 输出一些字符串,但这也给了自己一个空指针异常。 有人有建议吗?
【问题讨论】:
包含异常怎么样?什么是空?g
? img
?
我猜你的图形对象是空的,因为你在将组件添加到它的框架之前开始绘制图像(从构造函数中启动的那个线程)。
【参考方案1】:
如果在该语句之前没有渲染组件,getGraphics() 方法将返回 null,因此您将得到 NullPointerException,如果它被渲染,图形将不稳定并且更好地使用paintComponents...
另请参阅:Any alternative to calling getGraphics() which is returning null
import java.awt.*;
import java.awt.event.*;
class myframe extends Panel
public void paint(Graphics g)
g.setColor(Color.red);
g.fillRect(10,12,300,150);
public static void main(String args[])
Frame f=new Frame();
f.add(new myframe());
f.setSize(400,400);
f.setVisible(true);
【讨论】:
【参考方案2】:组件必须首先可见 在游戏/面板中启动线程之前尝试此操作
frame.add(面板) frame.setVisible(true)
然后在游戏/面板中启动线程
【讨论】:
【参考方案3】:您可能试图在 JPanel 呈现之前通过 getGraphics()
获取 Graphics 上下文,因此该方法返回 null。不要这样做。在组件上使用getGraphics()
来获取Graphics 上下文存在问题,其中一个是您在上面看到的问题,另一个是获得的Graphics 上下文不会持续存在。有时需要这样做,但通常我们通过paintComponent(...)
进行被动绘图。通常可以将 Swing Timer 用于动画循环。
【讨论】:
【参考方案4】:我认为这是因为您尝试使用 getGraphics() 而不是传统的paintComponent 覆盖进行绘制。你想使用这样的东西:drawImage is not drawing(见最上面的答案)。
【讨论】:
以上是关于getGraphics() 上的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章
OnGridImageSelectedListener.onGridImageSelected 上的空指针异常