我有以下代码:
view.setPressed(true);
view.postDelayed(new Runnable() {
@Override
public void run() {
view.setPressed(false);
}
}, 50);
变量声明很简单:
private View view;
我唯一给它赋值的地方是在 onInterceptTouchEvent 中:
view = parentView.findChildViewUnder(event.getX(), event.getY());
从 Crashlytics 我在 setPressed(false) 调用上得到空指针异常,堆栈:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view
.View.setPressed(boolean)' on a null object reference
at com.MyApp.common.ui.RecyclerItemClickListener$GestureListener$1.run(SourceFile:119)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
我添加了空检查,一切正常,Android Studio 中没有警告。
将代码移至某个函数并将 View 作为参数发送。 在函数声明中,它被声明为 final View 。现在 Android Studio 突出显示条件“view != null”始终为 false(好吧,它在这一行崩溃了,所以.. :)
我想知道它是否与垃圾收集以及它如何处理最终变量有关,或者它只是一个错误的检查错误。
最佳答案
view.postDelayed(new Runnable() {
@Override
public void run() {
if (view != null) {
view.setPressed(false);
}
}
}, 50);
在你的代码中,如果 view
会 null
, 你会在 view.postDelayed()
中有一个 NPE方法调用,并且由于引用是最终的,因此无法更改,因此在 Runnable
中它永远不能为 null,有两个选项:
-
View
是null
并在view.postDelayed
上崩溃, 所以你不需要在Runnable
中检查它 -
View
不是null
, 所以你不需要在Runnable
中检查它
关于java - 尝试在空指针对象上调用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41482929/