java - Java中如何检查变量是否已初始化?

标签 java

我正在摆弄一些代码,并遇到了空指针异常,这是由于未初始化的变量造成的。所以我只是想知道:有没有一种方法可以在尝试处理对象之前验证它是否确实存在,从而避免此类错误?

最佳答案

共有三种情况:

  1. 如果变量是方法参数或 catch 变量,则保证它被初始化,因为这是由 Java 语义处理的

  2. 如果变量是局部变量,则保证它被初始化,因为编译器不会让您访问未明确赋值的局部变量。

  3. 如果变量是类(静态)或实例变量,那么它将在声明中显式初始化,或者默认初始化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/

相关文章:

java - 解析Android获取用户列表

java - HSQL 数据库中的连接方式

java - 为什么字符串在 Java 和 .NET 中不能是可变的?

java - 需要帮助破译 Java 中的阶乘代码

java - 实用程序将字节数组中的位提取到新的字节[]中

java - MVP 泛型问题(Java)

java - 休息;线路不可达

java - 如何使用 JPA/EclipseLink 获取更新时更改的属性

java - 机器人 - 按住左键单击时自动单击

java - 301 从 sub1.mydomain.com 重定向到 anotherdomain.com/sub1