web-dev-qa-db-ja.com

Javaのスタックオーバーフローを試して/キャッチしますか?

Javaでスタックオーバーフロー例外を試行/キャッチできますか?どちらにせよ自分を投げているようです。手順がオーバーフローした場合、その値に「ペナルティ」を課したいと思います。

20
stereos

動作するようです:

public class Test {

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

}
28
Thilo

スタックオーバーフローが発生している場合は、無限再帰を試みているか、関数呼び出しを悪用している可能性があります。おそらく、再帰的ではなく、いくつかのプロシージャを反復的にすることを検討したり、再帰的プロシージャに正しいベースケースがあることを再確認したりすることができます。スタックオーバーフローの例外をキャッチすることは悪い考えです。根本的な原因に対処せずに症状を治療しています。

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はまったく異なる意味になります。ジャンプが深すぎた場合は、より浅いステップに分割して繰り返します。

4
Gangnus

例外ではなく、エラーをキャッチする必要があります

4
Daniel

私はマイケルに同意します-StackOverflowExceptionは、何かが非常にうまくいかなかったことを示すシグナルです。それを飲み込むのは良い考えではありません。最善の対策は、このエラーの根本原因を修正することです。

0
Slava Imeshev