私有成员变量在dispatchTouchEvent

时间:2017-08-31 15:52:24

标签: java android nullpointerexception nexus-5x

问题

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

已采取的步骤

  1. 我已经确认在我的代码库,反射或其他
  2. 中没有对该字段的其他写入
  3. 我已多次复制,但仅限于Nexus 5X设备。在其他设备上再现它是不成功的
  4. 我在Nexus 5X设备上发现了一种奇怪的行为,与我的应用无关。
  5. 简化类示例:

    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上似乎有一种奇怪的行为,如果你用一个手势将两根手指放在一起并以恰当的方式将它们组合在一起,就会有成千上万的触摸输入事件消失。这在应用程序内部和主屏幕上都会发生,并且不限于任何一个应用程序。这可能是相关的,或者它可能只是为再现做了足够的输入动作。

    潜在原因

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

1 个答案:

答案 0 :(得分:0)

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