Javaでスタックオーバーフロー例外を試行/キャッチできますか?どちらにせよ自分を投げているようです。手順がオーバーフローした場合、その値に「ペナルティ」を課したいと思います。
動作するようです:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
スタックオーバーフローが発生している場合は、無限再帰を試みているか、関数呼び出しを悪用している可能性があります。おそらく、再帰的ではなく、いくつかのプロシージャを反復的にすることを検討したり、再帰的プロシージャに正しいベースケースがあることを再確認したりすることができます。スタックオーバーフローの例外をキャッチすることは悪い考えです。根本的な原因に対処せずに症状を治療しています。
Java 8の機能機能により、この質問は比類のないほど重要になります。再帰を大量に使用し始めている間、StackOverflowExceptionは考慮しなければならないものです。
Java 8ラムダタイプにはStackOverflowExceptionをスローするものがありません。したがって、そのようなものを作成する必要があります。絶対に必要です。それがないと、IDEコントロール。
たとえば、整数->整数関数型は次のようになります。
_@FunctionalInterface
public interface SoFunction <U> {
public U apply(Integer index) throws StackOverflowException;
}
_
その後、StackOverflowExceptionをスローするラムダを受け入れる関数を記述できます。
_public T get(int currentIndex) throws StackOverflowException{
_
そして今だけ、再帰的なラムダを作成できます。
_fiboSequence.setSequenceFunction(
(i) ->
fiboSequence.get(i-2).add(fiboSequence.get(i-1))
);
_
その後、再帰チェーンfiboSequence.get(i)
を呼び出して、チェーン全体が計算できない場合は結果またはStackOverflowExceptionを取得できます。
再帰を使用する場合SOはまったく異なる意味になります。ジャンプが深すぎた場合は、より浅いステップに分割して繰り返します。
例外ではなく、エラーをキャッチする必要があります
私はマイケルに同意します-StackOverflowExceptionは、何かが非常にうまくいかなかったことを示すシグナルです。それを飲み込むのは良い考えではありません。最善の対策は、このエラーの根本原因を修正することです。