私有成员变量在 dispatchTouchEvent 中的 Nexus 5x 上变为空

private member variable is becoming null on Nexus 5x in dispatchTouchEvent

问题

在 Nexus 5x 设备上 android 运行期间,字段成员突然变为空值

已采取的步骤

  1. 我已确认在我的代码库、反射或其他方面没有对该字段的其他写入
  2. 我已经复制了很多次,但只在 Nexus 5X 设备上。在其他设备上复制它不成功
  3. 我在 Nexus 5X 设备上发现了一个与我的应用程序无关的奇怪行为。

简化的class示例:

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 应用程序运行期间,在我的实际等同于上面简化的 class 示例的 "method1" 中抛出了 NullPointerException。 我无法确定此变量为 null 的任何有效情况,因为它是在 TestA 构造函数中构造的,并且如果它在构造过程中失败,则不会有 TestA 实例调用 "method1" on.

我所掌握的唯一附加信息是,事件发生在 dispatchTouchEvent 上,特别是仅在 Nexus 5x 设备上(无法在其他设备上重现)。

有趣的可能无关的 Nexus 5X quirk/bug

Nexus 5x 上似乎有一个奇怪的行为,如果您以一个手势将两根手指并拢并以正确的方式将它们握在一起,则会触发数以千计的触摸输入事件。这发生在应用程序内部和主屏幕上,并且不限于任何一个应用程序。这可能是相关的,也可能只是为了复制做了足够多的输入动作。

潜在原因

  1. 序列化(变量可以反序列化为 null) - class 永远不会被序列化
  2. 我的代码库的反射 - 我没有在任何地方使用反射
  3. 由外部的东西反射???(即 android?)不确定是否有任何东西
  4. 内存损坏 - 这似乎很难在 Java 应用程序中完成
  5. 我的代码将其设置为 null - 我只在构造函数中访问该字段成员
  6. 调用方法时构造函数尚未完成 - 构造函数实际上只包含字段的 setter,没有其他内容。方法被外部调用
  7. Android 错误 - 极不可能,但不能完全消除。
  8. ??????

似乎@yegodm was correct in his comment on my post. According to Oracle docs因为对我的"TestA"对象的引用是从另一个线程设置的,非最终成员可能还没有发布到主内存。他们的示例 17.5-1 很好地展示了这一点。