你可以在java中尝试/捕获堆栈溢出异常吗?它似乎在抛出自己的方式。当我的程序溢出时,我想“惩罚”那个价值。
答案 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'}}">