gpt4 book ai didi

java - 私有(private)成员变量在 dispatchTouchEvent 中的 Nexus 5x 上变为空

转载 作者:行者123 更新时间:2023-11-29 02:37:49 24 4
gpt4 key购买 nike

问题

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

已经采取的步骤

  1. 我已确认在我的代码库、反射或其他方面没有对该字段的其他写入
  2. 我已多次复制它,但仅限于 Nexus 5X 设备。在其他设备上复制它不成功
  3. 我在 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 上似乎有一种奇怪的行为,如果您以一个手势将两根手指并拢并以正确的方式握在一起,则会触发数千个触摸输入事件。这发生在应用程序内部和主屏幕上,并且不限于任何一个应用程序。这可能是相关的,也可能只是为复制做了足够多的输入 Action 。

潜在原因

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

最佳答案

似乎@yegodm他对我的帖子的评论是正确的。根据Oracle docs因为对我的“TestA”对象的引用是从另一个线程设置的,所以非最终成员可能尚未发布到主内存。他们的示例 17.5-1 很好地展示了这一点。

关于java - 私有(private)成员变量在 dispatchTouchEvent 中的 Nexus 5x 上变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com