如何在ViewRoot#updateBidiOptions中修复NPE?

时间:2011-04-04 08:29:46

标签: android exception-handling

在Android市场的开发者控制台中,我们收到了很多这样的堆栈跟踪(当我们的应用程序崩溃时由用户发送):

java.lang.NullPointerException at
android.view.ViewRoot.updateBidiOptions(ViewRoot.java:290) at
android.view.ViewRoot.performTraversals(ViewRoot.java:737) at
android.view.ViewRoot.handleMessage(ViewRoot.java:1792) at
android.os.Handler.dispatchMessage(Handler.java:99) at
android.os.Looper.loop(Looper.java:143) at
android.app.ActivityThread.main(ActivityThread.java:5068) at
java.lang.reflect.Method.invokeNative(Native Method) at
java.lang.reflect.Method.invoke(Method.java:521) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at
dalvik.system.NativeStart.main(Native Method)

我们无法重现崩溃,当我们检查Android源代码时,没有名为updateBidiOptions的方法。用户评论似乎表明,当他们专注于EditText时会发生崩溃。许多用户还提到这种情况发生在HTC Desire HD上,但它并没有在我们这里的Desires上崩溃。

我们如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

通常当您在堆栈跟踪中看到不涉及任何自己的代码的NPE时,您在某些时候已将null作为参数传递给您不应该使用的Android框架。

因此,如果您在代码中有任何地方可能会怀疑是否将null作为选项传递,请仔细检查您是否允许这样做。

否则,Android版本会发生什么样的崩溃?

如果我们有android.view.ViewRoot.updateBidiOptions(ViewRoot.java:290)的正确来源,我们应该能够看到正在引用的引用并且是空引用。然后从那里退一步,直到我们看到你的来源提供的参考(可能也是null)。

但是,当我在姜饼克隆中查看ViewRoot.java的源代码时,我甚至看不到方法updateBidiOptions()。因此,我需要知道正在使用的近似Android版本,以便对可能的参考文献进行有根据的猜测。

答案 1 :(得分:1)

只是为了完成这个:问题在于自定义ROM(B0.8)。当ROM更新到不再调用updateBidiOptions的B0.8.4时,问题就解决了。

答案 2 :(得分:0)

好的简单解决方案就是: 如果你说这是编辑文本,那么找到行为代码的行,如果你说这是edittext,那么在try和catch中包装属于它的任何东西,然后在catch中尝试做第一次应该做的事情,如果是给予edittext焦点,请求它的焦点。

希望这有帮助, 最好的问候。

答案 3 :(得分:0)

似乎在这里发生了两件可能的事情中的一件。

麻省理工学院的研究人员可能会选择使用您的应用程序来测试被称为BiDi Screen的实验技术。他们很可能修改了一些Android操作系统,并重新编译它以连接可能在某些实验性移动设备上运行的实验技术。你可能已经发掘了谷歌的一个“黑色项目”。

另一个想法是,您正在查看来自其他国家/地区的“字符串本地化”错误。请参阅Class Bidi

  

Bidi对象提供有关用于创建它的文本的双向重新排序的信息。例如,这是正确显示阿拉伯语或希伯来语文本所必需的。这些语言本质上是混合方向的,因为它们从左到右排序数字,同时从右到左排序大多数其他文本。

由于您为一家大公司工作,请让您的上司向您发送一个阿拉伯之春国家的信息收集之旅,以收集“现场数据”,了解您的应用程序频繁崩溃的原因。