gpt4 book ai didi

java - 使用 CompletableFuture 故意破坏堆栈不会产生堆栈溢出?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:02 25 4
gpt4 key购买 nike

我试图查看 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;
}

我尝试在 eclipse 中调试大约计数 1455,但 eclipse 卡住并且无法加载堆栈跟踪,所以我找不到此行为背后的原因。

所以我的问题很简单

  1. 我的代码有什么不正确的地方吗?
  2. CompletableFuture 如何成功退出(或者在这种情况下我的 junit 测试用例如何通过)。

也许操作系统很重要...我使用的是 Mac。我以前有自己的本土 promise ,但这些 promise 都成功了。

最佳答案

thenAccept需要 Consumer并返回 CompletableFuture<Void> .如果消费者无一异常(exception)地正常返回,则 void future 以 null 完成。如果消费者抛出异常,则 future 将异常完成并带有该异常。

如果你想 catch StackOverflowException您需要从返回的 future 中获取它。有很多方法可以做到这一点。例如:

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

future.thenAccept(p -> recurse(p+1))
.exceptionally(e -> {
e.printStackTrace();
return null;
});

关于java - 使用 CompletableFuture 故意破坏堆栈不会产生堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com