Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StackOverflowerError发生多次_Java_Exception_Stack Overflow - Fatal编程技术网

Java StackOverflowerError发生多次

Java StackOverflowerError发生多次,java,exception,stack-overflow,Java,Exception,Stack Overflow,我试着用这段代码来理解StackOverflowerError何时发生以及它的行为 private static int testFunc(int i) { return i+1; } private static int add(int a){ try { a = add(a); } catch(StackOverflowError e){ System.out.println("StackOverflowError");

我试着用这段代码来理解StackOverflowerError何时发生以及它的行为

private static int testFunc(int i) {
    return i+1;
}

private static int add(int a){
    try {
        a = add(a);
    } catch(StackOverflowError e){
        System.out.println("StackOverflowError");
        return ++a;
    }
    return ++a;
}

public static void main(String[] args) throws Exception {
    char c = 'A';
    System.out.println((char)testFunc(c));
    int a = 0;
    System.out.println(add(a)); 
}
当我尝试执行这段代码时,我希望当StackOverflowerError发生并且打印的值比可用堆栈的深度大一个时,递归会停止。但是StackOverflowerr被多次捕获。 我得到了
StackOverflowerErrorsTackOverflowerErrorsTackOverflower….
打印了大约11次。虽然我使用了
System.out.println()
语句,但所有内容都打印在一行上。打印输出为0。它只印了一次

另外,当我包括一个
线程.sleep(1000)statement,为了确定为什么我得到如此奇怪的输出,我得到了一个更奇怪的输出。catch块内的print语句执行了多次。可能超过100,我没有确切的数字。在这里,在最初的几次print语句执行(前7-8次执行)中,所有内容都打印在同一行上,之后所有内容都打印在新行上。但总体等待时间为1秒(由于1000毫秒的睡眠时间),输出仍然为0

为什么我会得到这样的输出,为什么StackOverflowError会以这种方式工作

更新:我刚刚意识到我的原始代码上还有几行代码,这就产生了这种行为。更新了代码。 下面是我在没有
Thread.sleep(1000)
语句的情况下得到的实际输出

B
stackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowErrorstackOverflowError
0

更新2:我使用了预增量操作符而不是后增量操作符,现在我得到了堆栈深度的正确输出。但是如果删除对testFunc()的调用,则在打印堆栈深度之前,
stackoverflowerrror
语句只打印一次。但如果我有这些电话,它会被打印多次。为什么会这样?

为什么会有多张照片

System.out.println(“堆栈溢出错误”)
将在内部调用其他方法,这将导致抛出另一个
StackOverflowerError
。这发生在打印“StackOverflowerError”之后,但在打印新行之前

为什么有时只打印一张

上面的解释有点简化。实际上,这实际上取决于捕获第一个
StackOverflowerError
后堆栈上剩余的大小。根据启动递归时堆栈上剩余的初始空间,以及每个递归添加到堆栈中的数据量,
println()
的行为将有所不同:

  • 如果堆栈上有足够的空间用于调用
    println()
    • 您将在控制台中得到一个“StackOverflowerError”
  • 如果堆栈上没有足够的空间来调用
    println()
    • 要么调用将在打印“StackOverflowerr”之前抛出
    • 或者在打印“StackOverflowerError”之后,但在打印新行之前,调用将抛出
    • 或者调用将在“StackOverflowerError”之后抛出,并打印新行
然后将重复此操作,直到递归足够深入,可以毫无例外地调用
println()
。因此,您可以有3种不同的输出:

  • 一个“StackOverflowerr”和一个新行
  • 多个“StackOverflowerr”和一个新行
  • 多个“StackOverflowError”和多个新行
在每种情况下,您可能会得到比控制台中出现的“StackOverflowerError”更多的异常

你得到的结果是完全不确定的

为什么0


因为使用后增量运算符,因此,您总是返回0。

我刚刚得到
StackOverflower错误0
您可以发布stacktrace吗?您正在递归调用add方法,因此当发生堆栈溢出错误时,您将返回to add方法的当前堆栈值,该方法将再次开始递归,另一个stackoverflow过程将继续真正执行奇怪…@xxxvodnikxxx
B线程“main”异常中的异常:java.lang.NoClassDefFoundError从线程“main”中的UncaughtExceptionHandler抛出这是我得到的异常。再次抛出一个完全意外的异常。怪人在后增量运算符上非常愚蠢。当我将其更改为pre Increment时,得到了一个正确的数字。当我删除对testFunc()方法的调用时,catch语句中的print语句只执行一次。为什么会这样?因为通过更改主方法,可以更改堆栈的初始大小。我猜现在堆栈大小超过了它的限制,在返回一个递归后,
println()
调用不再抛出。。第二个
StackOverflowerError
不应该是未捕获的异常吗?不,为什么?每个递归都有自己的try-catch块。