这是代码:
import java.awt.*;
import javax.swing.*;
class tester {
JFrame fr;
JPanel p;
Graphics g;
tester() {
buildGUI();
}
public void buildGUI() {
fr=new JFrame();
p=new JPanel();
p.setBackground(Color.red);
g.setColor(Color.black);
g.drawOval(18,45,78,39);
g.fillOval(18,45,78,39);
fr.add(p);
fr.setVisible(true);
fr.setSize(500,500);
}
public static void main(String args[]) {
new tester();
}
}
以下是我尝试运行代码时产生的异常:
Exception in thread "main" java.lang.NullPointerException
at tester.buildGUI(tester.java:17)
at tester.<init>(tester.java:10)
at tester.main(tester.java:26)
为什么我会得到这些例外?我该如何解决。
您从未创建过对象g
,只是声明了它。
在创建一个对象并将其指定给对其具有引用的变量之前,该变量的值为null
。
这就是为什么你在这里得到NullPointerException
。
例如:
//created a variable holding a reference to an object of type JPanel
JPanel p;
//now the value of p is null. It's not pointing to anything
//created an object of type JPanel and assigned it to p
p=new JPanel();
//now p is not null anymore, it's pointing to an instance of JPanel
好吧,你没有为Graphic
对象g
做这件事。
您尚未初始化Graphics g
您应该实现一个paint
方法,并将绘制背景的逻辑移动到该方法中(请参阅油漆上的JavaDoc)
始终转到发生NullpointerException的行,并查看该行中使用了哪些对象。在这种情况下,只有图形对象"g"在使用。然后试着弄清楚为什么"g"有一个空引用。正如您所看到的,"g"从未被实例化,它只是被声明的。你必须把它更新一下。
这很好:由于您正在使用graphics in swing
,这将有所帮助。
import java.awt.*;
import javax.swing.*;
class tester_1 extends JPanel{
JFrame fr;
JPanel p;
tester_1() {
buildGUI();
}
public void buildGUI() {
fr=new JFrame();
p=new JPanel();
p.setBackground(Color.red);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.drawOval(18,45,78,39);
g.fillOval(18,45,78,39);
}
}
class tester {
tester() {
JFrame frm=new JFrame();
tester_1 t=new tester_1();
frm.add(t);
frm.setVisible(true);
frm.setSize(500,500);
}
public static void main(String args[]) {
new tester();
}
}
您得到的异常是因为您没有初始化变量g
。