我在使用android调试器时遇到了非常奇怪的行为。 GSON jar中的一行代码偶尔被点击,不应该被命中,导致抛出IllegalStateException。为了追踪抛出异常的原因,我在它的行上设置了一个断点。然而,当执行暂停时,我发现代理以某种方式从null更改为set。
具体来说,一旦遇到断点,我会点击另一个堆栈帧,然后单击返回带断点的帧,突然设置了delegate的值。然后我强制执行if语句,我的代码继续正常运行 - 没有NPE或其他问题。
我在我的项目中使用proguard,并且可以在android L模拟器和手机上重现这一点。这可能是一个程序错误,一个调试器错误,还是一个gson错误?
在首次点击断点时查看调试器状态的屏幕截图,然后在我点击其中之后不久。
这是在Gson.java,第885行
答案 0 :(得分:0)
看起来这是Gson中的一个线程问题。我正在使用的应用程序使用retrofit,它有一个类GsonConverter,可以跨多个线程重用相同的Gson实例。我查看了一个线程转储,并且至少看到了三个同时使用相同gson实例的线程。
我每次调整GsonConverter来创建一个新的Gson实例,这似乎解决了我的问题。
这是一个难以解决的问题,因为Gson会抛出一个JsonSyntaxException,这完全不直观。我可能会提交一个错误。