Java 是什么导致了“a”;NullPointerException“;这里有错误,我如何修复它?

Java 是什么导致了“a”;NullPointerException“;这里有错误,我如何修复它?,java,nullpointerexception,Java,Nullpointerexception,我试图制作一个简单的应用程序,只是为了试验Java图形,但我遇到了这个错误,因此如果有人能帮我解决这个问题,我将不胜感激。:) 我得到以下信息 Exception in thread "main" java.lang.NullPointerException at Main.draw(Main.java:41) at Main.createGUI(Main.java:36) at Main.main(Main.java:20) Java Result: 1 尝试运行以下代码时出错: imp

我试图制作一个简单的应用程序,只是为了试验Java图形,但我遇到了这个错误,因此如果有人能帮我解决这个问题,我将不胜感激。:)

我得到以下信息

 Exception in thread "main" java.lang.NullPointerException
at Main.draw(Main.java:41)
at Main.createGUI(Main.java:36)
at Main.main(Main.java:20)
 Java Result: 1
尝试运行以下代码时出错:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Main extends JFrame {
private static final long serialVersionUID = 1L;

public JPanel panel;

public static void main(String[] args) {

    Main m = new Main();
    m.setSize(500, 700);
    m.setDefaultCloseOperation(EXIT_ON_CLOSE);
    m.createGUI();
    m.setVisible(true);




}
private void createGUI() {
    Container window = getContentPane();

    panel = new JPanel();
    panel.setPreferredSize(new Dimension(500, 700));
    panel.setBackground(Color.WHITE);
    window.add(panel);

    Graphics paper = panel.getGraphics();
    draw(paper);

}

private void draw(Graphics g){
    g.drawRect(100, 100, 100, 100);
}
}
有人能告诉我如何解决这个问题,错误的原因是什么


谢谢大家!

出现
NullPointerException
的原因是
Graphics g
为null,您试图使用
null
对象调用
Graphics
方法之一


如果搜索,您将看到
panel.getGraphics()
返回null是一个常见问题,并且有一些解决方案。请参阅:

此行上的
图形
对象

g.drawRect(100, 100, 100, 100);
null
,正如您在UI可见之前使用的
JComponent\getGraphics
。这就是为什么通过覆盖
JPanel
面板的。这将保证
图形
对象
在使用前先初始化


永远不要使用
getGraphics

正如您所发现的,它可以返回
null
。这充其量只是上一个绘画周期的快照。对其绘制的任何内容都将在下一个绘制周期中被覆盖

摇摆中的绘画是无状态的。也就是说,在每个绘制周期中,您都需要重新绘制您想要绘制的每个对象

查看以获取在Swing中执行自定义绘制的概述


+1 to reimeus

注意:您始终可以读取堆栈跟踪,它将告诉您引发异常的确切行。在NullPointerException的情况下,您可以查看行中被取消引用的每个对象,并很快地找出它。术语“取消引用”在JLS中不存在,我认为不应该使用它,因为它来自具有语言级指针的其他语言时可能会混淆。(一般来说,我可以接受更多抽象术语,但不能接受更少抽象术语。)