Raj*_*eka 4 java stack-overflow
我java.lang.StackOverflowError在执行下面的代码时得到了
public class Insertion {
private static ArrayList integers1 = new ArrayList();
private static ArrayList integers2 = new ArrayList();
public static void main(String[] args) {
Collections.addAll(integers1, 1, 2, 3);
Collections.addAll(integers2, 5, 6, 7);
integers1.add(integers2);
System.out.println(integers1);
integers2.add(integers1);
System.out.println(integers2);
}
}
Run Code Online (Sandbox Code Playgroud)
请解释原因?
ami*_*mit 12
当您尝试打印列表时,会发生StackOverflow.
你有两个列表:integers1=[1,2,3,integers2]和integers2=[5,6,7,integers1]
当您尝试打印时integers2,实际打印:
[1,2,3,integers1.toString()]
Run Code Online (Sandbox Code Playgroud)
和integers1.toString()是[5,6,7,integers2.toString()],这反过来调用integers1.toString()一遍又一遍.这导致无限循环,仅在堆栈溢出时结束.
这个打印的理论结果将是[1,2,3,5,6,7,1,2,3,5,6,7,... (infinite repeat)],这是通过递归完成的 - 但在某些时候,堆栈已满并且程序中断.
在这一行:
integers1.add(integers2);
Run Code Online (Sandbox Code Playgroud)
您正在将整个数组列表添加到另一个数组列表中.当你这样做:
integers2.add(integers1);
Run Code Online (Sandbox Code Playgroud)
你创建一个循环引用.繁荣 - 当您尝试打印时会发生异常.
如果您使用过泛型,那就不会发生这种情况.我假设你只想在你的列表中保留整数,因此这个声明会导致你的代码无法编译:
private static ArrayList<Integer> integers1 = new ArrayList<>();
private static ArrayList<Integer> integers2 = new ArrayList<>();
// ...
// The method add(Integer) in the type ArrayList<Integer> is not applicable
// for the arguments (ArrayList<Integer>)
integers1.add(integers2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
475 次 |
| 最近记录: |