2

この例外が発生しました

Caused by: java.lang.StackOverflowError
    at java.util.ArrayList.get(ArrayList.java:322)[:1.6.0_12]
    at com.google.gson.stream.JsonWriter.peek(JsonWriter.java:354)

次のコードのように、例外オブジェクトをJsonテキストに変換しようとした場合

Exception exception = new Exception("Test");    
String gsonText = gson.toJson(exception);   
4

1 に答える 1

2

例外の原因インスタンスメンバー変数がそれ自体に初期化されるため、StackOverflowErrorが発生します。シリアライザーはオブジェクトをトラバースしようとしますが、原因への参照を追跡し続けるため、終了しません。

この問題を説明するGSONグーグルグループにメッセージがあります、提案された解決策は次のとおりです:

したがって、3つの(排他的な)選択肢があります。

1)独自の例外をシリアル化する場合は、すべての例外を変更して、原因をnullに設定するか、作成時にパラメーターを渡します。

2)getCause()から(null)を返す例外に対してinitCause(null)を呼び出します(ここでIllegalStateExceptionsが発生する可能性があります)

3)「cause」フィールドの逆参照を試みるのではなく、getCause()を呼び出す独自のシリアライザーを作成します。

また、シリアル化された例外コードをネットワーク経由で送信しようとすることは、やや異例の設計上の選択である可能性があります。

通常、アプリケーション開発者へのアドバイスは、クライアントにスタックトレースを表示しないことです。そのため、例外でtoStringを呼び出すか、サーバー側で例外をメッセージにマッピングして、代わりにメッセージを送信することをお勧めします。

于 2012-12-26T13:31:06.073 に答える