是这样的,实例化一个Frame时,调用init()方法,init()方法里有button.addActionListener
这一步之前先实例化一个connectButtonAction ,就是这一句:
connectButtonAction aconnectButtonAction=new connectButtonAction();
    jButton1.addActionListener(aconnectButtonAction);
可是实例化connectButtonAction时有要实例化一个Frame,就是这一句:
public connectButtonAction() {
    Frame aFrame = new Frame();
}也就是说两个类的实例化交替进行,无限循环,最后outOfMemory

解决方案 »

  1.   

    no.no.no ~怎么会无限循环呢?
    你能把你的完整代码房上来吗?这样我看不洞诶
      

  2.   

    为什么实例化connectButtonAction时必须要实例化Frame呢,这是你程序逻辑的需要吗?这样的逻辑好想不通啊
      

  3.   

    to xu_yun:
    是为了访问Frame里的控件,我也觉得逻辑上有问题,就是想不明白,我要疯了
      

  4.   

    声明一个Frame类,主要是实现一些GUI
    public class Frame extends JFrame { public Frame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
    进行初始化
    private void jbInit() throws Exception  {在这里给Frame中的Button加listener时,但aconnectButtonAction类中的构造函数创建了Frame的实例,由此造成了循环
        connectButtonAction aconnectButtonAction=new connectButtonAction();
        jButton1.addActionListener(aconnectButtonAction);
        cancelButtonAction acancelButtonAction=new cancelButtonAction();
        jButton2.addActionListener(acancelButtonAction);
        sendButtonAction asendButtonAction=new sendButtonAction();
        jButton3.addActionListener(asendButtonAction);
    }在这里给Frame中的Button加listener时,又用到了Frame中的构造函数,由此造成了循环
    package chatroom;
    import java.awt.event.*;
    import java.lang.*;
    import java.awt.*;
    public class connectButtonAction implements ActionListener{
      Frame aFrame;
      String jt;
      String address;
      int port;
      public connectButtonAction() {
      aFrame=new Frame();
      }
      public void actionPerformed(ActionEvent e){
        Object con=e.getSource();
        if((con instanceof Button)==true){    connection acon=new connection();
        acon.connect(this.subString(),this.subString1());      }
      }public String subString(){
        jt=aFrame.jTextField1.getText();
        int ipEnd=jt.indexOf("*");
        address=jt.substring(0,ipEnd-1);
        return address;  }
      public int subString1(){
        jt=aFrame.jTextField1.getText();
        int ipEnd=jt.indexOf("*");
        address=jt.substring(0,ipEnd-1);
        port=Integer.parseInt(jt.substring(ipEnd+1,jt.length()));
        return port;
      }
    }