什么是“java.lang.nullpointerexception:尝试调用空对象引用上的虚拟方法“…”以及如何解决它?

dldeef67  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(374)

此问题已在此处找到答案

什么是nullpointerexception,如何修复它((12个答案)
12个月前关闭。
我要去拿 NullPointerException 在标题中描述,但我不明白如何使用错误消息中的信息来调试它。我如何知道什么是空值,以及导致空值的常见原因是什么?
如果你看到一个错误,比如 java.lang.NullPointerException: Attempt to invoke virtual method '...' on a null object reference ,此问题旨在帮助您解决问题。
这也适用于以下所有类似错误:
java.lang.NullPointerException: Attempt to invoke interface method '...' on a null object reference java.lang.NullPointerException: Attempt to read from field '...' on a null object reference java.lang.NullPointerException: Attempt to read from null array java.lang.NullPointerException: Attempt to get length of null array 注意:这是一个规范的自我回答问题,旨在提供一个单一的位置来指出许多有问题的用户 NullPointerException s在android上,包含特定于android的建议。
对于这个问题的非android java版本,或者更多信息,请参阅什么是nullpointerexception,以及如何修复它?

busg9geu

busg9geu1#

什么是nullpointerexception?

首先,如果你不明白 null 是,还是什么 NullPointerException 意思是,看看什么是nullpointerexception,我该如何修复它?。这个答案的其余部分将假设你读过那篇文章。

如何调查原因

现在您已经了解了基本知识,您需要找出错误所在的行。看看什么是堆栈跟踪,以及如何使用它来调试应用程序错误?有关如何做到这一点的信息。
一旦您知道错误在哪一行,接下来需要做的就是弄清楚哪个变量是空的。错误消息将帮助您解决此问题。
如果您的错误看起来像(第一个) ... 可能是 virtualinterface -不重要的是:

java.lang.NullPointerException: Attempt to invoke ... method 'ReturnTypeOfMethod package.name.SomeClass.someMethod(...)' on a null object reference

这意味着类型为 package.name.SomeClass 你试着打电话给他 someMethodnull . 它还将列出方法的参数类型(如果有),其中 (...) 在示例中。
因此,如果您有以下代码:

MyClass myVariable = new MyClass();
String logMessage = "some other text: " + myVariable.toString() + someOtherVariable.method();

您将收到以下错误消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.mypackagename.MyClass.toString()' on a null object reference

你知道吗 myVariable 为null,因为这是类型的唯一变量 MyClass 那已经 toString() 去拜访它。这个 java.lang.String 就是这个意思 toString() 返回一个 String .
如果错误是 Attempt to read from field... ,然后应用上述建议,但要阅读字段参考( MyClass.someProperty )而不是调用一个方法( MyClass.someMethod() ).
如果错误是 Attempt to read from null array ,查找该行中按索引从数组中读取的任何内容(例如, someArrayVariable[i] ).
如果错误是 Attempt to get length of null array ,找一个 .length 调用数组变量。

常见的根本原因和解决办法

在activity/fragment中设置视图之前先查找视图ID

一个常见的问题是在实际设置视图之前调用findviewbyid。例如,在成员变量声明中调用它:

public class MyActivity extends Activity {
    private Button submitButton = findViewById(R.id.submitButton);
    // ... rest of Activity code ...
}

或在setcontentview之前:

public class MyActivity extends Activity {
    private Button submitButton;
    public void onCreate(Bundle savedInstanceState) {
        submitButton = findViewById(R.id.submitButton);
        setContentView(R.layout.activity_main);
    }
    // ... rest of Activity code ...
}

这不起作用,因为 findViewById 在调用之前执行 setContentView 在你的 onCreate 方法(适用于 Activity )或oncreateview(用于 Fragment ). 要解决此问题,请确保在之后调用它 setContentView . 对于 Fragment s、 您可以将代码放入 onViewCreated ,或确保您在 View 从机场回来 LayoutInflater.inflate 呼叫

布局id不正确/视图id/视图不在布局中

问题是,在给定的布局中,有时没有id传递给findviewbyid的视图。再次检查以确保您的 setContentViewLayoutInflater.inflate 调用具有正确的布局id(与xml文件名匹配),并且在该布局xml文件中有一个具有该id的视图(或它所包含的视图) <include> s) 。

相关问题