Java 在同一软件包中打开JFrame from按钮时出现内存不足错误?

Java 在同一软件包中打开JFrame from按钮时出现内存不足错误?,java,swing,jframe,out-of-memory,jbutton,Java,Swing,Jframe,Out Of Memory,Jbutton,我的程序运行得很好,直到我在第二类的JFrame中使用了一个switch语句,并在同一个包中从第一类打开。我的内存不足,出现了一个错误。。与堆空间相关。我删除了switch语句,但仍然发生了相同的错误。当jframes之间没有链接时,它们运行得非常完美。但当我链接它们时,第一帧起作用,单击“提交”按钮,它就会消失,可能是因为在它的操作中我使用了这个。dispose,但它没有打开第二帧,5-10分钟后,我就会出现内存不足错误 一级(J1) 类别2(J2) 带有switch语句的Class2代码,因

我的程序运行得很好,直到我在第二类的JFrame中使用了一个switch语句,并在同一个包中从第一类打开。我的内存不足,出现了一个错误。。与堆空间相关。我删除了switch语句,但仍然发生了相同的错误。当jframes之间没有链接时,它们运行得非常完美。但当我链接它们时,第一帧起作用,单击“提交”按钮,它就会消失,可能是因为在它的操作中我使用了这个。dispose,但它没有打开第二帧,5-10分钟后,我就会出现内存不足错误

一级(J1)

类别2(J2)

带有switch语句的Class2代码,因此我得到了那个错误

public Qualification abc=new Qualification();
    Sample aa= new Sample();
    public String s;
    public void open_sample()
    {
        this.setVisible(true);
        switch(abc.qualification)
        {
            case "BE":
            BE1 a=new BE1(); 
            break;
            case "10th/12th":
            C101 b=new C101();
            b.setVisible(true);
            break;
            case "MBA":
            MBA1 c=new MBA1();
            c.setVisible(true);
            break;
            case "CA":
            CA1 x=new CA1();
            x.setVisible(true);
            break;
            default:

        }
    }

private void sa1ActionPerformed(java.awt.event.ActionEvent evt) {                                   s= evt.getActionCommand();
         open_sample();
 }                                   

    private void sa4ActionPerformed(java.awt.event.ActionEvent evt) {                                    
        s= evt.getActionCommand();
   open_sample();}                                   

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                      System.out.print("hello");
  }                                        

    private void sa3ActionPerformed(java.awt.event.ActionEvent evt) {                                    
        s= evt.getActionCommand();
       open_sample();
    }                                   

    private void sa2ActionPerformed(java.awt.event.ActionEvent evt) {                                    
           s = evt.getActionCommand();
      open_sample();
    } 

当您尝试向内存中的堆空间区域添加更多数据时,会触发“java.lang.OutOfMemoryError:java堆空间”错误,但该数据的大小大于JVM在java堆空间中可以容纳的大小

在许多情况下,您可以通过在启动脚本中指定(或增加,如果有)-Xmx参数来增加堆空间,例如-Xmx1024m

我的第一个想法是:

final Sample a = new Sample();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        a.setVisible(true);
    }
});
this.dispose();
这通常是一个很好的实践,在事件队列处理线程上快速处理事件,稍后再做真正的工作

然而,有一个错误似乎是代码使用了字段而不是局部变量,并且似乎是在示例构造函数中使用的。所以Sample是一个嵌入式类?然后,
this.dispose()
将不会释放类本身,只要Sample未被释放,它将维护一个
JFrame1.this

不确定这是否有帮助,但稍微重写一下代码似乎是合适的

也尝试

setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Init
...
setVisible(false); // Instead of dispose()

上面添加的代码只显示了类的一部分(一些方法),但是如果您想获得帮助,必须发布代码。你说了一些关于你添加的switch语句的事情,但我不能在上面代码的任何地方这样做。@Patrick我删除了那个switch语句,希望能消除那个错误。。等等,我也会把它贴出来。。我正在使用netbeans。我还需要发布整个代码吗?@Patrick再次查看我的问题。我已经编辑过了@user3819936:似乎有一些实现缺陷,但从另一方面来说,请看一看。如果没有相关的代码,很难说在执行程序时,已经引用的
JFrame
s到底在做什么。在管理多个
JFrame
s@nIcEcOw好的,我会读到的,thanx:)
final Sample a = new Sample();
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        a.setVisible(true);
    }
});
this.dispose();
setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Init
...
setVisible(false); // Instead of dispose()