我正在弄乱一些代码,并遇到了一个空指针异常,这是未初始化变量的结果。所以我只是想知道:是否有一种方法可以在尝试处理该对象之前验证该对象是否确实存在,从而避免发生此类错误?
答案 0 :(得分:5)
有三种情况:
如果该变量是方法参数或catch变量,则可以确保将其初始化,因为Java语义会对其进行处理
如果变量是局部变量,则可以保证将其初始化,因为编译器不允许您访问未明确分配的局部变量。
如果变量是类(static
)或实例变量,则它将在声明中显式初始化,或者默认为初始化的 1 。
在第三种情况下,引用类型的默认初始值为null
,数字类型的默认初始值为零,false
的默认初始值为boolean
。始终可以在使用变量之前测试变量是否具有该(已知)值。
但是,您不知道它是否具有该值,因为它尚未初始化,或者该值是否已明确分配。例如:
if (object != null) {
// Object has been initialized
} else {
// ...
}
在else
情况下,我们不确定该变量是否已初始化。 可以已被明确初始化为null
。 可以初始化为其他内容,然后为其分配null
。
但是您可能只是想知道变量是否为null
。您可以按照上述方法使用== null
测试来确定...或以其他方式确定;例如使用三元运算符或Objects.nonNull
(Java 8及更高版本)。
1-类变量在某些情况下,在默认的初始化状态下仍可能会观察到用初始化程序声明的变量。
从NPE中捕获和恢复的建议出于很多原因是一个坏主意。原因之一是很难确定是什么原因导致了给定的NPE。 (因为它是您关注的特定变量...还是其他?例如:
SomeClass sc = // may be null
try {
sc.someMethod();
} catch (NullPointerException ex) {
// We don't know for sure if 'sc' was null, or if the NPE
// happened within the `someMethod()` call.
}
简而言之,这种方法容易产生误导性的结果。
处理未初始化变量问题的其他两种方法:
Optional
。但是,在现实世界中,这些都不是“防弹”的。
答案 1 :(得分:1)
如何判断变量是否已初始化?
if (object != null) {
// Object has been initialized
} else {
// Object is null, which means not yet initialized
}
如何处理尚未初始化的变量,换句话说,空对象?
try {
// Do something with the object
} catch (NullPointerException e) {
e.printStackTrace();
}
答案 2 :(得分:0)
只需简单地使用if子句检查对象是否不为空。如果是这样的话,它已经被初始化了。否则,还可以使用NullPointerException删除这些多余的try catch子句,因为您可以轻松地检查并避免使用空对象类型。
示例:
//your code below, the String object is just an example
String text = null;
if(text!=null) {
//object has been initialized
} else {
//object has not been initialized
}
答案 3 :(得分:0)
最通用的方法是:
Object obj
//whatever code...
if(obj != null){
//obj exists
}
else{
/*Handle the case where object doesn't exist, typically - trying to initialize it, but that's not the only case, actually lots of options available.*/}
但是,如果您知道有关对象类型或其未初始化原因的任何信息,最好使用更具体的信息。例如,org.apache.commons.lang.StringUtils.isBlank(String str)
用于字符串
也: https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html#isNull-java.lang.Object- https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html#requireNonNull-T- 以及2above附近的其他一些方法