Java 非null对象上的Android NullPointerException
我在访问对象之前检查对象的值;类坐标只有2个双参数(所以java原语)。它怎么能给我空点异常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
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
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实例。您需要更多帮助,创建一个最小的可复制示例,并与我们共享。