我如何在Play商店中寻找“不可能的” NPE?

时间:2019-04-29 10:58:17

标签: android nullpointerexception crash-reports

我有一个应用程序,多年来安装了很多应用程序,无论我做什么,似乎总是会有NPE。

所有这些NPE的根是突然不再存在的成员变量对象。不仅仅是一个对象,而且一般而言,由强大的引用持有的某些对象突然消失了。我不知道该应用程序处于什么状态,或者是由某些“应用程序杀手”应用程序或GC或...引起的。

我在Play商店“ vitals”中看到了这些NPE条目中的一些,甚至在我无法访问的android系统文件中。我不是一个初学者,并且对Java / android有了很好的了解,这就是为什么这让我非常困惑。我为每个版本添加了越来越多的防护功能,并且达到了过度杀伤的程度,但是每当我检查生命周期时,都会看到一个NPE“旧版本x”的旧文件没有被更改,并且它是一个对象在那里。

是否有任何方法可以找到删除的真正原因?或对这些例外的一般态度是什么?!

编辑:

我们不是在谈论一个NPE,而是在讨论数个事件,在整个包含20多个活动的应用中,每个NPE的发生率不到0.1%(根据Play商店)。多年来测试设备。

我认为它会在各种极端情况下发生,例如应用程序在后台运行数周或在内存不足的情况下在后台运行,等等,但它不会告诉我它何时发生(在Play商店条目中)

1 个答案:

答案 0 :(得分:0)

这种问题通常是由线程错误引起的。两个或多个线程共享变量对象或变量而没有足够的同步。这可能导致争用情况,或者由线程在内存读取中看到过时的值导致的更隐患的问题。 (了解有关Java内存模型的信息。)

不幸的是,没有万能的解决方案:

  • 我不知道有什么好的(免费)工具可以用来分析代码库中的线程错误。

  • 使用跟踪打印或调试器来查找它们很困难,因为a)这些错误往往很难重现,b)这些技术往往会改变程序的行为。

  • 您最好的选择是请专家为您查看代码。

  • 或者自己成为专家:首先阅读Goetz等人的“ Java Concurrency In Practice”。

  • 或者成为真正的专家:深入了解JLS第17章...特别是17.4。

避免此类问题的最佳方法是:

  • 全面了解Java线程和同步,
  • 全面了解您正在使用的框架/平台(例如Android应用程序框架)的线程安全要求,
  • 避免编写您自己的并发代码:更喜欢java.util.concurrency.*提供的更高级别的类,并且
  • 广泛的自动化测试。