Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 使用CompletableFuture故意吹扫堆栈不会导致堆栈溢出?_Java_Completable Future - Fatal编程技术网

Java 使用CompletableFuture故意吹扫堆栈不会导致堆栈溢出?

Java 使用CompletableFuture故意吹扫堆栈不会导致堆栈溢出?,java,completable-future,Java,Completable Future,我试图查看上的行为故意导致CompletableFuture的堆栈溢出,但却发现它导致了成功,我的递归循环刚刚停止并退出,junit测试通过。这真的不是我想要的行为。我想要一个快速失败的行为,这样我就知道如何修复我的代码 @Test public void testBlowTheStack() throws InterruptedException { recurse(0); System.out.println("done"); Thread.sleep(5000);

我试图查看上的行为故意导致CompletableFuture的堆栈溢出,但却发现它导致了成功,我的递归循环刚刚停止并退出,junit测试通过。这真的不是我想要的行为。我想要一个快速失败的行为,这样我就知道如何修复我的代码

@Test
public void testBlowTheStack() throws InterruptedException {
    recurse(0);

    System.out.println("done");
    Thread.sleep(5000);
}


private void recurse(int counter) {
    CompletableFuture<Integer> future = writeData(counter);
    future.thenAccept(p -> recurse(p+1));       
}

private CompletableFuture<Integer> writeData(int counter) {
    System.out.println("counter="+counter);
    if(counter == 1455) {
        System.out.println("mark");
    }

    CompletableFuture<Integer> future = new CompletableFuture<Integer>();
    future.complete(counter);
    return future;
}
@测试
public void testBlowTheStack()抛出InterruptedException{
递归(0);
系统输出打印项次(“完成”);
睡眠(5000);
}
私有void递归(int计数器){
CompletableFuture=写入数据(计数器);
然后接受(p->recurse(p+1));
}
专用CompletableFuture writeData(整型计数器){
System.out.println(“计数器=”+计数器);
如果(计数器==1455){
系统输出打印项次(“标记”);
}
CompletableFuture=新的CompletableFuture();
未来。完成(计数器);
回归未来;
}
我试图在eclipse中调试计数1455左右的代码,但是eclipse冻结并且无法加载堆栈跟踪,因此我无法找到这种行为背后的原因

所以我的问题很简单

  • 我的代码不正确吗
  • CompletableFuture是如何成功退出的(或者可能不是在这种情况下,我的junit测试用例是如何通过的)

  • 也许操作系统很重要…我在mac上。我以前有自己的自制承诺,这些承诺成功地打破了僵局。

    然后accept
    接受
    消费者
    并返回一个
    可完成的未来
    。如果消费者无一例外地正常返回,则无效期货将以null完成。如果消费者抛出异常,则未来将异常完成该异常

    如果您想捕获
    StackOverflowException
    ,您需要从返回的将来获取它。有很多方法可以做到这一点。例如:

    future.thenAccept(p -> recurse(p+1)).join();
    


    啊,当然……这是有道理的,因为异常会被捕获……酷,这比我预期的要多。嗯,我必须测试stackoverflow,然后调用ExceptionOnly方法(并在那里强制堆栈溢出)……我想知道这是如何处理的。我还没有尝试过,但我对JavaAPI文档的解释是,第二个异常将丢失,未来将与原始异常一起完成。换句话说,如果异常地抛出一个异常,那就是noop。
    future.thenAccept(p -> recurse(p+1))
          .exceptionally(e -> {
              e.printStackTrace();
              return null;
          });