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 google group 上有一条消息描述了这个问题,建议的解决方案是:

因此,您有三个(独家)选择:

1)如果您要序列化自己的异常,请修改所有异常以将原因设置为空,或在构造时传递参数。

2) 对从 getCause() 返回 (null) 的任何异常调用 initCause(null) (可能最终在这里得到一些 IllegalStateExceptions)

3) 编写您自己的序列化程序,它会调用 getCause() 而不是尝试取消引用“原因”字段。

此外,尝试通过网络发送序列化的异常代码可能是一种非正统的设计选择。

通常对应用程序开发人员的建议是不要向客户端显示堆栈跟踪,因此我建议在异常上调用 toString 或以其他方式将异常映射到服务器端的消息并发送消息。

于 2012-12-26T13:31:06.073 回答