我正在摆弄一些代码,并遇到了空指针异常,这是由于未初始化的变量造成的。所以我只是想知道:有没有一种方法可以在尝试处理对象之前验证它是否确实存在,从而避免此类错误?
最佳答案
共有三种情况:
如果变量是方法参数或 catch 变量,则保证它被初始化,因为这是由 Java 语义处理的
如果变量是局部变量,则保证它被初始化,因为编译器不会让您访问未明确赋值的局部变量。
如果变量是类(
静态
)或实例变量,那么它将在声明中显式初始化,或者默认初始化1。
在第三种情况下,引用类型的默认初始值为 null
,数字类型的默认初始值为 0,或者 boolean
的默认初始值为 false
。在使用变量之前总是可以测试它是否具有该(已知)值。
但是,您不知道它是否具有该值,因为它尚未初始化,或者该值是否已显式分配。例如:
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.
}
简而言之,这种方法很容易产生误导性结果。
<小时/>处理未初始化变量问题的其他几种方法:
- 使用 @NotNull 注释和静态代码分析器。
- 使用
可选
。
然而,在现实世界的 Java 中,这些都不是“防弹”的。
关于java - Java中如何检查变量是否已初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144412/