在Java中尝试/捕获堆栈溢出?

你能尝试/捕获java中的堆栈溢出exception吗? 它似乎在抛出自己的方式。 当我的程序溢出时,我想“惩罚”那个价值。

似乎工作:

public class Test { public static void main(String[] argv){ try{ main(null); } catch(StackOverflowError e){ System.err.println("ouch!"); } } } 

如果您正在获得堆栈溢出,则可能尝试无限递归或严重滥用函数调用。 也许你可能会考虑迭代一些程序,而不是递归或仔细检查你的递归​​过程中是否有正确的基本情况。 捕获堆栈溢出exception是一个坏主意; 你正在治疗症状而没有解决根本原因。

你必须捕获错误,而不是exception

Java 8的function特性使这个问题变得无比重要。 因为我们开始大量使用递归,所以我们必须计算StackOverflowException。

Java 8 lambdas类型中没有一个抛出StackOverflowException。 所以,我们必须创造这样的。 这是绝对必要的,没有它我们甚至不会通过IDE控件。

例如,Integer – > Integer函数类型可能如下所示:

 @FunctionalInterface public interface SoFunction  { public U apply(Integer index) throws StackOverflowException; } 

之后我们可以编写一个接受lambdas抛出StackOverflowException的函数。

 public T get(int currentIndex) throws StackOverflowException{ 

只有现在我们才能创建一个递归的lambda:

 fiboSequence.setSequenceFunction( (i) -> fiboSequence.get(i-2).add(fiboSequence.get(i-1)) ); 

之后我们可以调用递归链fiboSequence.get(i)并获得结果或StackOverflowException,如果整个链是不可计算的。

在使用递归的情况下,SO具有完全不同的含义:你跳得太深,重复它分成更浅的步骤。

我同意迈克尔的观点 – StackOverflowException是一个信号,说明出了什么问题。 吞咽它不是一个好主意。 最好的做法是解决此错误的根本原因。

这是我的解决方案,

 public class TryExample { public static void main(String[] args){ try { int no=10/0; } catch (Exception e) { System.err.println("Arithmetic Exception occurs!"); } } }