Java 非null对象上的Android NullPointerException

Java 非null对象上的Android NullPointerException,java,android,nullpointerexception,Java,Android,Nullpointerexception,我在访问对象之前检查对象的值;类坐标只有2个双参数(所以java原语)。它怎么能给我空点异常 if(r==null) { Log.d(TAG, "r is null"); continue; } else if(r.getCoordinates()==null) { Log.d(TAG, "r.getCoordinates() is null"); continue; } else { try { i

我在访问对象之前检查对象的值;类坐标只有2个双参数(所以java原语)。它怎么能给我空点异常

if(r==null) {
    Log.d(TAG, "r is null");
    continue;
}
else if(r.getCoordinates()==null) {
    Log.d(TAG, "r.getCoordinates() is null");
    continue;
}
else {
    try {
        if (r.getCoordinates().getLong() < 0) { //NullPointerException
            continue;
    } catch(Exception e){
          Log.d(TAG, "r.getCoordinates().getLong() gives null "+r.getName());  //this print the r name
    }
}
if(r==null){
Log.d(标记“r为空”);
继续;
}
else if(r.getCoordinates()==null){
d(标记“r.getCoordinates()为null”);
继续;
}
否则{
试一试{
如果(r.getCoordinates().getLong()<0){//NullPointerException
继续;
}捕获(例外e){
Log.d(标记“r.getCoordinates().getLong()给出null”+r.getName());//这将打印r名称
}
}
它只在发布模式下发生(使用proguard),在调试模式下可以

-keep class it.mypackage.model.** {
    public <fields>;
    public <methods>;
}
-保留class it.mypackage.model.**{
公众;
公众;
}

坐标和r类型是模型包的一类,我想在一些场景中,您的代码可以给出NPE。例如:

  • 如果
    r
    是非最终字段,那么另一个线程可以在
    r==null
    测试之后更新
    r
    引用

  • 如果
    r
    指向的对象是可变的,那么另一个线程的操作(例如)可能会导致一次调用
    r.getCoordinates()
    返回非空值,然后第二次调用返回
    null

  • 如果
    getLong()
    的返回类型是一个标准包装类,那么
    r.getCoordinates().getLong()
    可能会返回一个
    null
    。当您将其取消绑定以与0进行比较时,这将导致NPE

  • NPE可以在
    getCoordinates
    getLong
    中抛出(您还没有向我们显示stacktrace…)

  • 由于构建或部署过程中存在一些问题,您正在运行的编译(和模糊)代码可能与您正在查看的源代码不同。(这些情况会发生…)

  • 实际代码可能与您向我们展示的代码在某些重要方面有所不同

  • 如果您需要更多帮助,您需要创建一个并与我们共享


    如果捕获到异常,它将打印
    r
    名称,同样的
    r
    实例也是如此


    不一定。它们可能是同名的不同实例。

    如果
    r.getCoordinates().getLong()
    返回一个
    Double
    变量,则应该存在NullPointerException

    您可以尝试以下代码

     Long ll = null;
     if (ll < 0) { //NullPointerException
        System.out.println("negative");
     } else {
        System.out.println("non negative");
     }
    
    Long ll=null;
    如果(ll<0){//NullPointerException
    系统输出打印项次(“负数”);
    }否则{
    System.out.println(“非负片”);
    }
    
    注释行上出现NullPointerException


    在另一种情况下,
    r.getCoordinates().getLong()
    返回一个基元类型变量
    double
    ,但您的代码在多线程环境中运行。其他线程更改的变量很容易导致NullPointerException。

    抱歉@Edric我更新了问题坐标实例可以为null,即使它的属性不能为null。因此,r对象也可以为null。Nolong是double(原语)我已经更新了这个问题,如果我发现异常,它会打印r名称,所以是同一个rIf实例。您需要更多帮助,创建一个最小的可复制示例,并与我们共享。