Java中声明的未初始化变量会发生什么?

时间:2016-08-22 10:04:30

标签: java initialization

它有价值吗?

我试图理解Java中已声明但未初始化的变量/对象的状态是什么。

我实际上无法测试它,因为我一直得到“未初始化”编译错误,我似乎无法抑制它。

虽然例如,我猜想如果变量是integer,它可能等于 0

但是,如果变量是一个String,那么它将等于null还是isEmpty()会返回true

所有非初始化变量的值是否相同?或者每个声明(意思,整数,字符串,双精度等)在未明确初始化时具有不同的值?

更新

正如我现在看到的,如果变量被声明为locally或者Class,它会产生很大的不同,尽管我似乎无法理解为什么在类中声明为静态时它没有错误,但在主要声明时它产生"Not Initialized" error

3 个答案:

答案 0 :(得分:5)

JVM究竟如何完全取决于JVM,对于程序员来说并不重要,因为编译器可以确保您不会读取未初始化的本地变量。

字段然而不同。在读取它们之前不需要分配它们(除非它们是final)并且未分配的字段值对于引用类型是null或者是适当原语的0值如果字段具有基本类型,则输入类型。

s.isEmpty()用于尚未分配的字段String s;会产生NullPointerException

  

正如我现在看到的,如果变量被声明为locallyClass,它会产生很大的不同,尽管我似乎无法理解为什么在类中声明时它不给出错误,但在主要声明时会产生"Not Initialized"错误。

通常,处理没有值的值是不可取的。出于这个原因,语言设计师有两个选择:

a)为尚未初始化的变量定义一个默认值 b)在写入变量之前阻止程序员访问变量。

b)很难为字段实现,因此选择a)字段。 (可能有多种方法读/写可能有效或无效,具体取决于调用的顺序,这只能在运行时确定。)

对于局部变量,选项b)是可行的,因为可以检查方法执行的所有可能路径的赋值语句。在本地变量的语言设计过程中选择了此选项,因为它可以帮助找到许多容易出错的错误。

答案 1 :(得分:1)

默认值将基于数据类型和使用初始化变量的位置。请参阅下面的原始默认值。

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 2 :(得分:1)

Fabian已经提供了一个非常明确的答案,我只是尝试从official documentation添加规范以供参考。

类中的字段

  

声明字段时,不一定总是需要分配值。编译器将声明但未初始化的字段设置为合理的默认值。通常,此默认值将为零或null,具体取决于数据类型。但是,通常认为依赖这种默认值是编程风格。

如果未指定default value,则仅将其视为样式,而在local variables中则不一样。

局部变量

  

局部变量略有不同;编译器从不将默认值分配给未初始化的局部变量。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误