为什么主方法在java中每次执行时都不会得到相同次数的递归调用?

为什么主方法在java中每次执行时都不会得到相同次数的递归调用?,java,Java,当我试着运行这个程序几次时,I的最终值是11407,11417,11400等等,然后显示堆栈溢出错误。为什么每次执行此程序时,i的最终值都不相同 public class MainRecursive { static int i=0; public static void main (String arg[]) { i++; System.out.println(i); main(arg); } } 尝试添加S

当我试着运行这个程序几次时,
I
的最终值是
11407
11417
11400
等等,然后显示堆栈溢出错误。为什么每次执行此程序时,
i
的最终值都不相同

public class MainRecursive {
    static int i=0;

    public static void main (String arg[])
    {
        i++;
        System.out.println(i);

        main(arg);
    }
}

尝试添加
System.out.flush()打印后


由于堆栈大小没有改变,每次运行时我都会得到相同的值,但我认为
println()
在不同时间更新输出之前会被异常中断-这取决于控制台,操作系统等,不可能是确定性的。

@nobalG这与此无关-OP正在查询堆栈溢出条件为何不是确定性的。这完全是虚假的接近投票-
static
与此毫无关系。有趣。对我来说,这些值大致是
10813
10820
。是的,这是一个有趣的问题-我不知道堆栈溢出可能是不确定的。这也不是说应该有很多(如果有的话?)垃圾收集在进行。@T.J.Crowder是的。结果中为什么会出现这种行为?根据什么因素,结果是不同的?结果是相同的。无论如何,感谢您的回复确认!在添加flush之后,我得到了一致的10821好主意,但实际上我并没有得到一致的结果,在MacOS X 10.10上也使用Java 1.8.0_20。这样做会更改
I
的最终值,但不会使其一致。好主意,但不是答案。