【问题标题】:NullPointerExceptions only on some Samsung Galaxy devices?NullPointerExceptions 仅在某些三星 Galaxy 设备上?
【发布时间】:2014-10-29 15:58:04
【问题描述】:

我正在使用 LibGDX。当我的应用程序启动时,它会创建一个屏幕。当 Screen 被加载时,它会调用一个静态函数Module.createStyles()

这个函数创建了一系列样式,这些样式将在应用程序的其余部分中使用(内置的 LibGDX 样式,如 WindowStyle、LabelStyle、TextButtonStyle - 用于创建用户界面对象的所有类型)。

屏幕完成后,它会调用Module.disposeStyles()

无论如何,根据我的 Google Analytics(分析)崩溃报告,我在尝试使用 Module.dialogStyle 创建对话框时随机得到 NullPointerException

ExitDialog exitDialog = new ExitDialog("Are you sure?", Module.dialogStyle);

Thread: GLThread 2089, Exception: java.lang.IllegalArgumentException: style cannot be null.
at package.Window.setStyle(Window.java:181)
at package.Window.<init>(Window.java:63)
at package.Dialog.<init>(Dialog.java:65)
at package.ExitDialog$1.<init>(ExitDialog.java:38)

Module.dialogStyle 绝对没有理由应该为空。我将该字段设为空的唯一位置是在Module.disposeStyles() 中,并且该函数仅在应用程序中的一个特定位置(在最后)调用。

我会认为这是我的代码中的一个错误,即使 95% 的用户从未体验过它。然而,所有 5% 的体验者似乎都是 Galaxy 用户,我不确定这是否是巧合:

  • 银河 S4
  • 银河 S III
  • GALAXY Tab 3 lite

有人有什么想法吗? Galaxy 设备没有内置 RAM 管理器吗?会不会跟这个有关系?

【问题讨论】:

  • 可能垃圾收集是新的,并且经过改进以成为 Galaxy 中最好的,因此该设备总是比竞争对手拥有更多的内存。在将上下文保存在全局字段中的代码中,我通常遇到问题(没有星系)。一旦这些被删除,许多问题就消失了。我也不再使用 onDispose onDestroy 我在 onStop 中进行所有清理。
  • 不知道为什么你的风格在 Galaxy 设备上突然指向 null,如果不在这些设备上进行测试,可能很难弄清楚。您可以在创建对话框之前为样式添加一个空检查,对于空样式的情况,会触发 Google Analytics 事件并添加更多信息。 (并在没有对话框的情况下退出屏幕。。)这样至少用户不会真正注意到这个错误,你仍然可以继续跟踪它。

标签: java android nullpointerexception libgdx galaxy


【解决方案1】:

我会假设:

Module.dialogStyle

是对Module 类上的static 属性的引用。

您可能会遇到 Android 如何管理 JVM 生命周期的副作用。在某些情况下(尤其是在更大的设备上),JVM 实例将被重新使用,这可能会导致问题(例如,静态初始化程序已经运行,并且不会重新运行)。或者,static 指针可能会从应用程序的上一次运行到下一次运行,并且其中可能具有无效或不正确的状态。这取决于您的应用的组织方式。

如果您包含更多显示如何以及何时初始化静态字段的代码,我们可能会弄清楚。

有关不同生命周期以及如何在本地重现它们的更多详细信息,请参阅: http://bitiotic.com/blog/2013/05/23/libgdx-and-android-application-lifecycle/

【讨论】:

  • 是的,你说得对,它是一个静态属性。不过有趣的是,我不知道您的应用程序的某些部分可能会在内存中受到影响,我认为这是全部或全部。我想我可以在调用onResume() 并验证它们是否仍然存在时检查这些静态成员。
猜你喜欢
  • 2019-08-04
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
相关资源
最近更新 更多