你能在Java中使用try/catch捕获堆栈溢出异常吗?无论如何,似乎它都会抛出自己。当我的程序溢出时,我想要“惩罚”该值。
你能在Java中使用try/catch捕获堆栈溢出异常吗?无论如何,似乎它都会抛出自己。当我的程序溢出时,我想要“惩罚”该值。
似乎可以正常工作:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
Error
直接继承自Throwable
,而不是通过Exception
继承。 - Tom Hawtin - tackline如果你遇到栈溢出的情况,很可能是在尝试无限递归或过度滥用函数调用。也许你可以考虑将一些过程迭代化,而不是递归,或者仔细检查你的递归过程中是否有正确的基本情况。捕获栈溢出异常是一个坏主意;这只是治标不治本。
Java 8的功能特性使得这个问题变得异常重要。因为我们开始广泛使用递归,StackOverflowException是我们必须考虑的事情。
Java 8的lambda类型中没有一个抛出StackOverflowException。因此,我们必须自己创建。这是绝对必要的,否则甚至无法通过IDE控制。
例如,Integer -> Integer函数类型可以如下:
@FunctionalInterface
public interface SoFunction <U> {
public U apply(Integer index) throws StackOverflowException;
}
接下来,我们可以编写一个函数,该函数将接受抛出StackOverflowException的lambda表达式。
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的意义完全不同:您已经跳得太深了,请将其分解成更浅的步骤再重复操作。