问题
在Nexus 5x设备上的android运行时期间,字段成员突然变为空值
已经采取的步骤
我已经验证在我的代码库中没有其他对该字段的写入,反射或其他操作
我已多次复制它,但仅在Nexus 5X设备上复制了它。在其他设备上复制失败
我发现Nexus 5X设备上的异常行为与我的应用无关。
简化的类示例:
public class TestA
{
// While not final, could have been final as no writes other than in the constructor
private Object impossibleToBeNull;
public TestA()
{
impossibleToBeNull = new Object();
}
public void method1()
{
impossibleToBeNull.toString(); // Null pointer occurs here
}
}
描述
不知何故,在我的Android应用程序运行期间,从上面的简化类示例中,我实际等效的“ method1”抛出NullPointerException。
我无法确定在此变量为null的任何有效情况,因为该变量是在TestA构造函数中构造的,并且如果它的构造失败,将不会有一个TestA实例调用“ method1”。
我仅有的其他信息是发生在dispatchTouchEvent上,特别是仅在Nexus 5x设备上发生(无法在其他设备上重现)。
有趣的潜在无关的Nexus 5X怪胎/错误
Nexus 5x上似乎有一种奇怪的行为,如果您用一个手势将两个手指合在一起并以正确的方式握在一起,则会发生数千个触摸输入事件。这在应用程序内部和主屏幕上都发生,并且不限于任何一个应用程序。这可能是相关的,或者可能只是为复制进行了足够的输入操作。
潜在原因
序列化(变量可以反序列化为null)-该类从不序列化
我的代码库的反射-我不在任何地方使用反射
由外部事物反射?(例如android?)不确定是否有任何作用
内存损坏-似乎在Java应用程序中很难做到
我的代码将其设置为null-我仅在构造函数中访问该字段成员
调用方法时,构造函数尚未完成-构造函数实际上仅包含该字段的setter,仅此而已。方法在外部调用
Android错误-难以置信,但无法完全消除。
??????
最佳答案
@yegodm在他对我的帖子的评论中似乎是正确的。根据Oracle docs,因为对我的“ TestA”对象的引用是从另一个线程设置的,所以非最终成员可能尚未发布到主内存中。他们的例子17.5-1很好地展示了这一点。