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

时间:2010-03-29 03:57:54

标签: java stack-overflow

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

6 个答案:

答案 0 :(得分:26)

似乎工作:

public class Test {

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

}

答案 1 :(得分:8)

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

答案 2 :(得分:4)

您必须捕获错误,而不是异常

答案 3 :(得分:4)

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

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

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

@FunctionalInterface
public interface SoFunction <U> {
    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的含义完全不同:你跳得太深,重复分成更浅的步骤。

答案 4 :(得分:0)

我同意Michael的观点 - StackOverflowException是一个信号,表明出了问题。吞咽它不是一个好主意。最好的做法是解决此错误的根本原因。

答案 5 :(得分:-3)

这是我的解决方案,

 <input class="bx--toggle" id="toggle-view" type="checkbox" ng-model="vm.monthView" ng-change="vm.getRelevantData()" 
    ng-attr-data-modal-target="{{vm.alertForSaveAll ? '#add-save-all-alert-modal': 'undefined'}}">