私有成员变量在 dispatchTouchEvent 中的 Nexus 5x 上变为空
private member variable is becoming null on Nexus 5x in dispatchTouchEvent
问题
在 Nexus 5x 设备上 android 运行期间,字段成员突然变为空值
已采取的步骤
- 我已确认在我的代码库、反射或其他方面没有对该字段的其他写入
- 我已经复制了很多次,但只在 Nexus 5X 设备上。在其他设备上复制它不成功
- 我在 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 上似乎有一个奇怪的行为,如果您以一个手势将两根手指并拢并以正确的方式将它们握在一起,则会触发数以千计的触摸输入事件。这发生在应用程序内部和主屏幕上,并且不限于任何一个应用程序。这可能是相关的,也可能只是为了复制做了足够多的输入动作。
潜在原因
序列化(变量可以反序列化为 null) - class 永远不会被序列化
我的代码库的反射 - 我没有在任何地方使用反射
- 由外部的东西反射???(即 android?)不确定是否有任何东西
- 内存损坏 - 这似乎很难在 Java 应用程序中完成
我的代码将其设置为 null - 我只在构造函数中访问该字段成员
调用方法时构造函数尚未完成 - 构造函数实际上只包含字段的 setter,没有其他内容。方法被外部调用
- Android 错误 - 极不可能,但不能完全消除。
- ??????
似乎@yegodm was correct in his comment on my post. According to Oracle docs因为对我的"TestA"对象的引用是从另一个线程设置的,非最终成员可能还没有发布到主内存。他们的示例 17.5-1 很好地展示了这一点。
问题
在 Nexus 5x 设备上 android 运行期间,字段成员突然变为空值
已采取的步骤
- 我已确认在我的代码库、反射或其他方面没有对该字段的其他写入
- 我已经复制了很多次,但只在 Nexus 5X 设备上。在其他设备上复制它不成功
- 我在 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 上似乎有一个奇怪的行为,如果您以一个手势将两根手指并拢并以正确的方式将它们握在一起,则会触发数以千计的触摸输入事件。这发生在应用程序内部和主屏幕上,并且不限于任何一个应用程序。这可能是相关的,也可能只是为了复制做了足够多的输入动作。
潜在原因
序列化(变量可以反序列化为 null)- class 永远不会被序列化我的代码库的反射- 我没有在任何地方使用反射- 由外部的东西反射???(即 android?)不确定是否有任何东西
- 内存损坏 - 这似乎很难在 Java 应用程序中完成
我的代码将其设置为 null- 我只在构造函数中访问该字段成员调用方法时构造函数尚未完成- 构造函数实际上只包含字段的 setter,没有其他内容。方法被外部调用- Android 错误 - 极不可能,但不能完全消除。
- ??????
似乎@yegodm was correct in his comment on my post. According to Oracle docs因为对我的"TestA"对象的引用是从另一个线程设置的,非最终成员可能还没有发布到主内存。他们的示例 17.5-1 很好地展示了这一点。