黑马程序员技术交流社区

标题: 关于GUI中空指针异常的问题 [打印本页]

作者: 李晓旭    时间: 2012-4-7 00:28
标题: 关于GUI中空指针异常的问题
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;

  4. class MyWindowDemo
  5. {
  6.         private Frame f;
  7.         private TextField tf;
  8.         private Button but;
  9.         private TextArea ta;

  10.         private Dialog d;
  11.         private Label lab;
  12.         private Button lbut;
  13.         MyWindowDemo()
  14.         {
  15.                 init();
  16.         }

  17.         public void init()
  18.         {
  19.                 f = new Frame("my window");
  20.                 f.setBounds(300,100,500,400);
  21.                 f.setLayout(new FlowLayout());

  22.                 tf = new TextField(30);

  23.                 but = new Button("提交");

  24.                 ta = new TextArea(15,40);

  25.                 f.add(tf);
  26.                 f.add(but);
  27.                 f.add(ta);

  28.                 myEvent();
  29.                 f.setVisible(true);


  30.         }

  31.         public void myEvent()
  32.         {
  33.                 but.addActionListener(new ActionListener()
  34.                 {
  35.                         public void actionPerformed(ActionEvent e)
  36.                         {
  37.                                 ta.setText("");
  38.                                 String dirPath = tf.getText();

  39.                                 File dir = new File(dirPath);

  40.                                 if(dir.exists() && dir.isDirectory())
  41.                                 {
  42.                                         String[] names = dir.list();
  43.                                         for(String name :names)
  44.                                         {
  45.                                                 ta.append(name+"\r\n");
  46.                                                 //sop(name);
  47.                                         }
  48.                                 } else
  49.                                 {
  50.                                         sop("sdas");
  51.                                         d = new Dialog(f,"lallalalalal",true);
  52.                                         lab = new Label("-------fail--------");
  53.                                         lbut = new Button("ok");
  54.                                         d.setBounds(400,200,500,100);
  55.                                         d.setLayout(new FlowLayout());
  56.                                         d.add(lab);
  57.                                         d.add(lbut);
  58.                                         d.setVisible(true);
  59.                                 }
  60.                         }
  61.                 });
  62.                 f.addWindowListener(new WindowAdapter()
  63.                 {
  64.                         public void windowClosing(WindowEvent e)
  65.                         {
  66.                                 System.exit(0);
  67.                         }
  68.                 });
  69.                 ta.addKeyListener(new KeyAdapter()
  70.                 {
  71.                         public void keyPressed(KeyEvent e)
  72.                         {
  73.                                 e.consume();       
  74.                         }
  75.                 });
  76.                 /*                    从这里往下再运行时,具体说是初始化的时候就已经报空指针异常
  77.                 d.addWindowListener(new WindowAdapter()
  78.                 {
  79.                         public void windowClosing(WindowEvent e)
  80.                         {
  81.                                 d.setVisible(false);
  82.                         }
  83.                 });
  84.                 lbut.addActionListener(new ActionListener()
  85.                 {
  86.                         public void actionPerformed(ActionEvent e)
  87.                         {
  88.                                 d.setVisible(false);
  89.                         }
  90.                 });
  91.                 */

  92.         }


  93.         public static void main(String[] args)
  94.         {
  95.                 new MyWindowDemo();
  96.         }
  97.        
  98.         public static void sop(Object obj)
  99.         {
  100.                 System.out.println(obj);
  101.         }
  102. }
复制代码
因为毕老师视频里把创建对话框对象的代码写在了init()里面,但是他在视频中也说到了,为了节省内存空间,可以把创建对象放到,触发事件之后,我是这么理解的,所以把代码放到了else{}里面,但是在myEvent()中,显然在初始化时还没有创建Dialog的对象,所以出现了空指针异常,我想知道这种情况一般都是如何解决的
即能节省内存,又可以躲开空指针异常
我想到一个办法,但是失败了
if(d!=null)
{
      再触发新的事件
}
因为这些是在初始化的时候加载到监听机制中的,所以d对象为空的时候已经跳过了这些代码

作者: liumeng    时间: 2012-4-7 06:06

        private Dialog d;

        private Label lab;

        private Button lbut;
没new

作者: 李晓旭    时间: 2012-4-7 11:26
有new的,64-66行
作者: 李晓旭    时间: 2012-4-7 11:27
liumeng 发表于 2012-4-7 06:06
private Dialog d;

        private Label lab;

有new的,64-66行
作者: pray    时间: 2014-4-26 03:44
让人佩服得五体投地的好帖




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2