【问题标题】:Cannot Understand The Exception无法理解异常
【发布时间】:2011-06-02 12:00:11
【问题描述】:

这是代码:

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)

为什么会出现这些异常? 我该如何解决。

【问题讨论】:

  • 任何反对的人请解释原因!

标签: java swing user-interface graphics


【解决方案1】:

您从未创建过对象 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 这样做。

【讨论】:

    【解决方案2】:

    你还没有初始化Graphics g

    您应该实现一个paint 方法并将绘制背景的逻辑移到该方法中(参见paint 上的JavaDoc)

    【讨论】:

      【解决方案3】:

      始终转到发生 NullpointerException 的行并查看该行上使用了哪些对象。在这种情况下,只有图形对象“g”在使用。然后试着弄清楚为什么“g”有一个空引用。如您所见,“g”从未被实例化,它只是被声明了。你必须更新它。

      【讨论】:

        【解决方案4】:

        这很好用: 由于您使用的是 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

        【讨论】:

        • 我没有对你投反对票,我也不会,但你在玩“找出差异”的游戏,我认为这就是原因。我在说什么?好吧,您发布了很多代码并说“我认为这会有所帮助”,但您并没有说哪个特定部分是有帮助的。回答时最好过于具体。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多