java - 尝试在空指针对象上调用异常

标签 java null

我有以下代码:

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(好吧,它在这一行崩溃了,所以.. :)

enter image description here

我想知道它是否与垃圾收集以及它如何处理最终变量有关,或者它只是一个错误的检查错误。

最佳答案

view.postDelayed(new Runnable() {
    @Override
    public void run() {
        if (view != null) {
          view.setPressed(false);
        }
    }
}, 50);

在你的代码中,如果 viewnull , 你会在 view.postDelayed() 中有一个 NPE方法调用,并且由于引用是最终的,因此无法更改,因此在 Runnable 中它永远不能为 null,有两个选项:

  1. Viewnull并在 view.postDelayed 上崩溃, 所以你不需要在 Runnable 中检查它
  2. View不是 null , 所以你不需要在 Runnable 中检查它

关于java - 尝试在空指针对象上调用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41482929/

相关文章:

MySQL GROUP_CONCAT 与 COALESCE 关于 NULL 值

java - 仅从字符串的右侧删除空格

java - 无法访问 AWS EC2 Linux Env​​ 上的 jboss 7 管理控制台

MySQL:使用单个查询将整个表中的 'NULL' 作为字符串替换为实际 NULL 值

null - 空 IntegerProperty 的 GQL 测试

SQLite3 : Insert BLOB with NULL characters in C++

java - 无法使用executeQuery()

java - 如何配置特定 FileHandler 的属性

java - 使用 Jackson 解析 JSON 数组,其中对象是字符串?

php - MySQL - 如何插入可能为空的值