线程“主”java.lang.OutOfMemoryError 中的异常:在 ArrayList 中添加值时发生 Java 堆空间错误 [重复]

Posted

技术标签:

【中文标题】线程“主”java.lang.OutOfMemoryError 中的异常:在 ArrayList 中添加值时发生 Java 堆空间错误 [重复]【英文标题】:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space error ocurred while adding value in ArrayList [duplicate] 【发布时间】:2021-11-28 02:28:49 【问题描述】:

这是我从三个数组中查找共同元素的代码。 我正在尝试使用 add() 函数在 ArrayList 中添加元素,但出现内存不足错误。 这是我的代码-

ArrayList<Integer> commonElements(int A[], int B[], int C[], int n1, int n2, int n3) 

    // code here
    ArrayList<Integer> ls=new ArrayList<Integer>(n1);
    int i=0,j=0,k=0;
    while(i<n1 && j<n2 && k<n3)
        if(A[i]==B[j] && B[j]==C[k])
            int t=A[i];
            ls.add(t);
        else if(A[i]<B[j])
            i++;
        else if(B[j]<C[k])
            j++;
        else
            k++;
        
    
    return ls;

这是我的错误-

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3720)
at java.base/java.util.Arrays.copyOf(Arrays.java:3689)
at java.base/java.util.ArrayList.grow(ArrayList.java:237)
at java.base/java.util.ArrayList.grow(ArrayList.java:242)
at java.base/java.util.ArrayList.add(ArrayList.java:485)
at java.base/java.util.ArrayList.add(ArrayList.java:498)
at Solution.commonElements(GFG.java:68)
at GFG.main(GFG.java:36)

【问题讨论】:

使用调试器单步调试您的代码,您会发现问题所在。在您向列表中添加项目的情况下,哪些循环索引变量会增加? 当所有元素相等时,将其添加到输出并再次迭代。由于您不更改 i、j 或 k,因此元素仍然相同,并且您再次添加相同的元素。又一次。 【参考方案1】:
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 

Java 说它内存不足。有一个无限循环导致条件永远不会退出 while 循环,无限地递增变量之一,直到达到内存上限。查看while流控的条件。

【讨论】:

【参考方案2】:

当找到共同元素时,即

if(A[i]==B[j] &amp;&amp; B[j]==C[k]) int t=A[i]; ls.add(t);

您没有增加 i 或 j 或 k,因此它陷入了无限循环,导致堆空间使用。增加它们应该可以理想地完成工作。

【讨论】:

【参考方案3】:

我需要在 if 条件中增加 i,j,k 以防止出现此错误。

ArrayList<Integer> commonElements(int A[], int B[], int C[], int n1, int n2, int n3) 

    // code here
    ArrayList<Integer> ls=new ArrayList<Integer>(n1);
    int i=0,j=0,k=0;
    while(i<n1 && j<n2 && k<n3)
        if(A[i]==B[j] && B[j]==C[k])
            if(!ls.contains(A[i]))
                ls.add(A[i]);
            
            i++;
            j++;
            k++;
        else if(A[i]<B[j])
            i++;
        else if(B[j]<C[k])
            j++;
        else
            k++;
        
    
    return ls;

【讨论】:

以上是关于线程“主”java.lang.OutOfMemoryError 中的异常:在 ArrayList 中添加值时发生 Java 堆空间错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

主线程怎么给子线程发送消息

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数

java 子线程 回调 主线程