未初始化的局部变量 - 无错误:Java

问题描述:

这里有两个未初始化的局部变量。仍然这不会给编译时或运行时错误并且完全执行。在Java和How(这个解释是值得欢迎的)中这个东西是允许的吗?未初始化的局部变量 - 无错误:Java

class A2{ } 

public class A { 
public static void main(String[] args) { 
    int x; 
    A2 a2; 

    System.out.println("Main"); 
} 

} 
+0

我读过“总是初始化一个局部变量”“一个未初始化的局部变量违反了java规则 – IDontKnow006

该代码没有任何不正确。你实际上并没有使用这些变量,所以没有问题。如果你确实尝试使用它们,那么它会成为一个问题。例如,

System.out.println(a2); 
System.out.println(x); 

会带来 “变量 'X'/ 'A2' 可能尚未intitialized” 的错误。将没有默认值或运行代码的能力。这将是编译时错误,您的代码将无法运行。如果变量是类字段,则它们将获得某些类型的默认值,否则将会获得默认值。

+0

如果在这个代码中x得到一个默认值,那么我可以打印这个值吗? – IDontKnow006

+0

在这里他们会得到什么值。我没有使用它们。编写代码时,他们是否将某些东西放在堆栈中? – IDontKnow006

+0

为此编辑。 @ IDontKnow006 – ChiefTwoPencils

这两个变量都没有在代码中使用。一旦你尝试使用它作为System.out.println(“Main”+ x);它会给你编译错误,因为局部变量没有被初始化。

+0

在这他们将获得什么价值。我没有使用它们。编写代码时,他们是否将某些东西放在堆栈中? – IDontKnow006

+0

@ IDontKnow006正如你永远无法观察那个价值,这个问题是毫无意义的。甚至可能完全删除变量。 – EJP

+0

@EJP我没有得到你的声明 - 甚至有可能........完全删除。“ – IDontKnow006

是的,只要你不访问它们,就可以在上面的代码中完成局部变量声明。如果你碰巧写了任何访问这些变量的代码,代码将不会编译。

根据Java语言规范,除非在访问之前初始化,否则不能访问本地变量(在方法内部声明的变量)。下面是Java语言规范的SE 8

https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4.1

第16章 - 明确赋值

“对于一个局部变量或空白决赛场上的每次访问,则x必须被明确 分配在访问之前或发生编译时错误。“

第14章

14.4.2局部变量声明 局部变量声明语句的执行是一个可执行语句。每次执行 时,声明符按从左到右的顺序处理。如果声明者 具有初始值设定项,则初始值设定项会被评估并将其值分配给该变量。 由§16(明确赋值)的 规则如果声明符不具有初始化,然后到可变每引用必须是 通过赋值给变量,或编译时错误的执行之前进行。 只有在对前面的 初始化程序的评估正常完成时,才会评估每个初始化程序(除第一个之外)。 只有当最后一个初始化程序的评估 正常完成时,才执行本地变量声明。 如果局部变量声明不包含初始值设定项,则始终执行 。