downdream 2012-03-07 14:10
浏览 258
已采纳

程序抛出NullPointerException异常不明白!

在myFrame2中的actionPerformed方法下面加上Form1 = Application.Form1;就没问题,但是在windowOpened方法下面已经有了为什么还出现这种问题?

 

import java.awt.*;
public class j02110501_Project1  {

  private static j02110501_Project1 Application;
 
  myFrame1 Form1;
  myFrame2 Form2;
  myFrame3 Form3;
 
  public static void main(String arg[])  {
    Application = new j02110501_Project1();
    Application.Form1 = new myFrame1( Application );
    Application.Form2 = new myFrame2( Application );
   
    Application.Form1.setVisible(true);
  }
}

import java.awt.*;
import java.awt.event.*;
public class myFrame1 extends Frame  {
  private j02110501_Project1 Application;
  private myFrame1 Form1;
  private myFrame2 Form2;
  private myFrame3 Form3;
 
  Button B1, B2;
  Label L1, L2;
  public myFrame1(j02110501_Project1 app)  {
    Application = app;
    Form1 = this;
   
    this.setLayout(null);
    this.setBounds(100,300,265,200);
    this.setTitle("Form1:主窗体");
    this.addWindowListener(new myWindowAdapter() );
    B1 = new Button("Show Form2");
    B1.setBounds(60,30,140,30);
    B1.addActionListener(new myActionListener() );
    this.add(B1);
    L1 = new Label("0",Label.RIGHT);
    L1.setBounds(60,70,140,30);
    L1.setBackground(Color.PINK);
    this.add(L1);
    B2 = new Button("Show Form3");
    B2.setBounds(60,120,140,30);
    B2.addActionListener(new myActionListener());
    this.add(B2);
    L2 = new Label("0",Label.RIGHT);
    L2.setBounds(60,160,140,30);
    L2.setBackground(Color.PINK);
    this.add(L2);
  }
 
  class myWindowAdapter extends WindowAdapter  {
    public void windowOpened(WindowEvent e)  {
      //此时Application所有静态建立的窗体都已建立完成
      //取得Form1所属项目的其他窗体
      Form2 = Application.Form2;
    }
    public void windowClosing(WindowEvent e)  {
      System.exit(0);
    }
  }
 
  class myActionListener implements ActionListener  {
    public void actionPerformed(ActionEvent e)  {
      if(e.getSource() == B1)  {
        Form2.setVisible(true);
      }
      else if(e.getSource()==B2)  {
        if(Form3 == null)  {
          Application.Form3 = new myFrame3(Application);
          Form3 = Application.Form3;
          System.out.println("Create Form");
        }
        else
          System.out.println("Show Form");
       
        Form3.setVisible(true);
      }
    }
  }
}



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class myFrame2 extends Frame  {
  private j02110501_Project1 Application;
  private myFrame1 Form1;
  private myFrame2 Form2;
  private myFrame3 Form3;
 
  TextField text1,text2;
  Label lb1;
  Button B1;
  public myFrame2( j02110501_Project1 app)  {
    Application = app;
    Form2 = this;
   
    this.setLayout(null);
    this.setBounds(420,300,300,90);
    this.setTitle("Foem2: 加法运算");
    this.addWindowListener(new myWindowAdapter());
   
    text1 = new TextField("0",6);
    text1.setBounds(30,40,80,30);
    this.add(text1);
    lb1 = new Label("+");
    lb1.setBounds(115,40,20,30);
    this.add(lb1);
    text2 = new TextField("0",6);
    text2.setBounds(150,40,80,30);
    this.add(text2);
    B1 = new Button("计算");
    B1.setBounds(240,40,40,30);
    B1.addActionListener(new myActionListener());
    this.add(B1);
  }
 
  class myActionListener implements ActionListener  {
 
    public void actionPerformed(ActionEvent e)  {
      //Form1 = Application.Form1;
      double sum;
      try  {
        sum = Double.parseDouble( Form2.text1.getText().trim())
            + Double.parseDouble(Form2.text2.getText().trim());
       
        Form1.L1.setText(String.valueOf(sum));

        if(Form3 != null)  {
          System.out.println("called by Form2:\n Form3.text1 = "
                      + Form3.text1.getText()
                      + " Form3.text2 = "
                      + Form3.text2.getText() );
        }
      }
      catch(NumberFormatException ecp)  {
        JOptionPane.showMessageDialog(null,"必须输入两个“数值”!");
      }
    }
  }
 
  class myWindowAdapter extends WindowAdapter  {
    public void windowOpend(WindowEvent e)  {
      Form1 = Application.Form1;
      Form3 = Application.Form3;
    }
   
    public void windowActivated(WindowEvent e)  {
      if(Form3 == null)
        Form3 = Application.Form3;
    }
    public void windowClosing(WindowEvent e)  {
      Form2.setVisible(false);
    }
  }
}



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class myFrame3 extends Frame  {
  private j02110501_Project1 Application;
  private myFrame1 Form1;
  private myFrame2 Form2;
  private myFrame3 Form3;
 
  TextField text1,text2;
  Label lb1;
  Button B1;
  public myFrame3(j02110501_Project1 app)  {
    Application = app;
    Form3 = this;
   
    this.setLayout(null);
    this.setBounds(420,410,300,90);
    this.setTitle("Foem3: 乘法运算");
    this.addWindowListener(new myWindowAdapter());
   
    text1 = new TextField("1",6);
    text1.setBounds(30,40,80,30);
    this.add(text1);
    lb1 = new Label("*");
    lb1.setBounds(115,40,20,30);
    this.add(lb1);
    text2 = new TextField("1",6);
    text2.setBounds(150,40,80,30);
    this.add(text2);
    B1 = new Button("计算");
    B1.setBounds(240,40,40,30);
    B1.addActionListener(new myActionListener());
    this.add(B1);
  }
 
  class myActionListener implements ActionListener  {
    public void actionPerformed(ActionEvent e)  {
      double multiplication;
      try  {
        multiplication =
             Double.parseDouble(Form3.text1.getText().trim())
             * Double.parseDouble(Form3.text2.getText().trim());
        Form1.L2.setText(String.valueOf(multiplication));
        System.out.println("called by Form3:\n Form2.text1 = "
                                + Form2.text1.getText()
                                + " Form2.text2 = "
                                + Form2.text2.getText() );
      }
      catch(NumberFormatException ecp)  {
        JOptionPane.showMessageDialog(null,"必须输入两个“数值”!");
      }
    }
  }
 
  class myWindowAdapter extends WindowAdapter  {
    public void windowOpened(WindowEvent e)  {
      Form1 = Application.Form1;
      Form2 = Application.Form2;
    }
    public void windowClosing(WindowEvent e)  {
      Form3.setVisible(false);
    }
  }
}

错误信息:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at myFrame2$myActionListener.actionPerformed(myFrame2.java:46)
        at java.awt.Button.processActionEvent(Unknown Source)
        at java.awt.Button.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$1.run(Unknown Source)
        at java.awt.EventQueue$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$2.run(Unknown Source)
        at java.awt.EventQueue$2.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

 

  • 写回答

5条回答 默认 最新

  • iteye_16709 2012-03-07 19:45
    关注

    [quote]在myFrame2中的actionPerformed方法下面加上Form1 = Application.Form1;就没问题,但是在windowOpened方法下面已经有了为什么还出现这种问题?
    [/quote]
    这个我运行了。问题出在
    myFrame2中的全局变量 private myFrame1 Form1; 它是你的主窗体
    没有被实例化。在myFrame2你应该让他指向j02110501_Project1 中已经实例化
    的主窗体。在这里就是你的Application.Form1。

    一个对象在没有被实例化之前,对象应用是不能操作对象的方法的。
    会报[code="java"]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    [/code]

    也就是你的对象引用指向了空指针。

    在这里Form1 指向了空指针。所以报错。你让它指向Application.Form1
    就不会报错了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办