什么是;java.lang.NullPointerException:尝试调用虚拟方法'';“在空对象引用上”;我的意思是,我如何解决它?
我得到了标题中描述的什么是;java.lang.NullPointerException:尝试调用虚拟方法'';“在空对象引用上”;我的意思是,我如何解决它?,java,android,debugging,nullpointerexception,Java,Android,Debugging,Nullpointerexception,我得到了标题中描述的NullPointerException,但我不明白如何使用错误消息中的信息来调试它。我如何知道什么是空值,以及导致空值的常见原因是什么 如果您看到类似java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“…”之类的错误,此问题旨在帮助解决您的问题 这也适用于以下所有类似错误: java.lang.NullPointerException:尝试对空对象引用调用接口方法“…” java.lang.NullPointerExceptio
NullPointerException
,但我不明白如何使用错误消息中的信息来调试它。我如何知道什么是空值,以及导致空值的常见原因是什么
如果您看到类似
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“…”之类的错误,此问题旨在帮助解决您的问题
这也适用于以下所有类似错误:
java.lang.NullPointerException:尝试对空对象引用调用接口方法“…”
java.lang.NullPointerException:尝试读取空对象引用上的字段“…”
java.lang.NullPointerException:尝试从空数组读取
java.lang.NullPointerException:尝试获取空数组的长度
注意:这是一个规范的自我回答问题,旨在提供一个单一的位置,指出许多用户对Android上包含Android特定建议的NullPointerException
s有疑问。
有关此问题的非Android Java版本,或有关更多信息,请参阅
什么是NullPointerException?
首先,如果您不明白什么是null
,或者NullPointerException
是什么意思,请查看。这个答案的其余部分将假设你读过那篇文章
如何调查原因
现在您已经了解了基本知识,您需要找出错误所在的行。请参阅,以获取有关如何执行此操作的信息
一旦您知道错误在哪一行,接下来需要做的就是弄清楚哪个变量是空的。错误消息将帮助您解决此问题
如果您的错误看起来像(第一个…
可能是虚拟的
或接口
-哪一个并不重要):
这意味着您试图调用someMethod
的package.name.SomeClass
类型的变量是null
。它还将列出方法的参数类型(如果有),其中示例中有(…)
因此,如果您有以下代码:
MyClass myVariable=new MyClass();
String logMessage=“其他文本:”+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()
返回一个字符串
如果错误是尝试从字段读取…
,则应用上述建议,但查找字段引用(MyClass.someProperty
),而不是调用方法(MyClass.someMethod()
)
如果错误为“尝试从空数组读取”
,请在该行中查找按索引从数组读取的任何内容(例如,someArrayVariable[i]
)
如果错误是尝试获取空数组的长度
,请查找对数组变量的.length
调用
常见的根本原因和解决办法
在Activity/Fragment中设置视图之前先查找视图ID
一个常见的问题是在实际设置视图之前调用findViewById。例如,在成员变量声明中调用它:
公共类MyActivity扩展活动{
私有按钮submitButton=findViewById(R.id.submitButton);
//…活动代码的其余部分。。。
}
或在setContentView之前:
公共类MyActivity扩展活动{
私人按钮提交按钮;
创建时的公共void(Bundle savedInstanceState){
submitButton=findViewById(R.id.submitButton);
setContentView(R.layout.activity_main);
}
//…活动代码的其余部分。。。
}
这不起作用,因为在onCreate
方法(对于Activity
)或onCreateView(对于Fragment
)中调用setContentView
之前执行findViewById
)。要解决此问题,请确保在setContentView
之后调用它。对于Fragment
s,您可以将代码放入onViewCreated
,或者确保在从LayoutInflater.flate调用返回的视图中调用它
布局ID不正确/视图ID/视图不在布局中
问题是,在给定的布局中,有时没有ID传递给findViewById的视图。仔细检查以确保您的setContentView
或LayoutInflater.inflate
调用具有正确的布局ID(与XML文件名匹配),并且在该布局XML文件中存在具有该ID的视图(或其
s的视图)。@Marqueisoflorne我可以尝试说服您这是一个不同的问题吗?你建议的副本,我在我的问题和答案中都链接了它,它很好地解释了NullPointerException
s的一般原则。但是,它没有解释如何使用特定于Android的错误消息来确定哪个变量确切地为null
。我已经在评论中多次向那些抱怨canonical没有帮助他们的人解释了这一点,并且写了这个问题/答案来解释如何做到这一点,这样人们就不必在几十篇单独的帖子上解释了。我想我的回答也解释了这个问题的含义:这是第一步,我的其余答案建立在这个问题及其答案的基础上,添加了关于如何使用Android错误消息的详细信息。此外,它还解释了常见的安卓特定原因:这些原因都不是inc
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.mypackagename.MyClass.toString()' on a null object reference