我有一个应用程序,多年来安装了很多应用程序,无论我做什么,似乎总是会有NPE。
所有这些NPE的根是突然不再存在的成员变量对象。不仅仅是一个对象,而且一般而言,由强大的引用持有的某些对象突然消失了。我不知道该应用程序处于什么状态,或者是由某些“应用程序杀手”应用程序或GC或...引起的。
我在Play商店“ vitals”中看到了这些NPE条目中的一些,甚至在我无法访问的android系统文件中。我不是一个初学者,并且对Java / android有了很好的了解,这就是为什么这让我非常困惑。我为每个版本添加了越来越多的防护功能,并且达到了过度杀伤的程度,但是每当我检查生命周期时,都会看到一个NPE“旧版本x”的旧文件没有被更改,并且它是一个对象在那里。
是否有任何方法可以找到删除的真正原因?或对这些例外的一般态度是什么?!
编辑:
我们不是在谈论一个NPE,而是在讨论数个事件,在整个包含20多个活动的应用中,每个NPE的发生率不到0.1%(根据Play商店)。多年来测试设备。
我认为它会在各种极端情况下发生,例如应用程序在后台运行数周或在内存不足的情况下在后台运行,等等,但它不会告诉我它何时发生(在Play商店条目中)
答案 0 :(得分:0)
这种问题通常是由线程错误引起的。两个或多个线程共享变量对象或变量而没有足够的同步。这可能导致争用情况,或者由线程在内存读取中看到过时的值导致的更隐患的问题。 (了解有关Java内存模型的信息。)
不幸的是,没有万能的解决方案:
我不知道有什么好的(免费)工具可以用来分析代码库中的线程错误。
使用跟踪打印或调试器来查找它们很困难,因为a)这些错误往往很难重现,b)这些技术往往会改变程序的行为。
您最好的选择是请专家为您查看代码。
或者自己成为专家:首先阅读Goetz等人的“ Java Concurrency In Practice”。
或者成为真正的专家:深入了解JLS第17章...特别是17.4。
避免此类问题的最佳方法是:
java.util.concurrency.*
提供的更高级别的类,并且