【问题标题】:How to solve this StackOverflowError in this bad recursion example?如何在这个糟糕的递归示例中解决这个 StackOverflowError?
【发布时间】:2013-06-01 16:20:17
【问题描述】:

我遇到了与错误递归和 StackOverflowError 相关的编程问题。 我在一个单独的线程中有这个案例:

public void subscribe(final String channel) {
   try {
      // blocking command
      client.subscribe(channel);
   } catch(ConnectionException e) {
      subscribe(channel);
   }
}

假设这个 ConnectionException 只是周期性地发生(就像每分钟一样)。几百次后,我显然得到了一个 StackOverflowError。

我知道发生了什么,但我不知道如何解决这个问题(即在不增加调用堆栈的情况下静默重新订阅)。有什么想法吗?

【问题讨论】:

  • 什么是拦截命令?
  • 使用递归来检测事件太过分了..你为什么不实现和使用回调..
  • 阻塞命令基本上是一个监听远程数据的命令。数据被并行异步推送到监听器。
  • 如果你不想实现重试机制,那么你应该在重试实际发生之前先休眠。所以在 Try 块中睡一会儿吧。
  • @AmitD 睡眠不会延迟问题吗?

标签: java recursion stack-overflow


【解决方案1】:

为什么不使用像他这样的简单循环?

public void subscribe(final String channel) {
   while(true){
       try {
          // blocking command
          client.subscribe(channel);
          return;
       } catch(ConnectionException e) {
          // ignored
       }
   }
}

【讨论】:

  • 正确,它会工作。我没有想到这一点,因为我不是 while(true) 的忠实粉丝,谢谢队友
【解决方案2】:

现在你有一个无限递归。 设置递归中断条件。您需要有一个递归应该停止的条件。放置一个 if 块并在某个点逻辑地停止递归。

【讨论】:

  • 我同意,但我找不到任何正确的条件来破坏递归,这就是困扰我的地方。看起来使用递归不适合我的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2012-11-16
  • 2017-01-15
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多