这是两个未初始化的局部变量。这仍然不会给出编译时间或运行时错误并完全执行。这件事在 Java 和 How 中是否允许(欢迎解释)。
class A2{ }
public class A {
public static void main(String[] args) {
int x;
A2 a2;
System.out.println("Main");
}
}
这是两个未初始化的局部变量。这仍然不会给出编译时间或运行时错误并完全执行。这件事在 Java 和 How 中是否允许(欢迎解释)。
class A2{ }
public class A {
public static void main(String[] args) {
int x;
A2 a2;
System.out.println("Main");
}
}
该代码没有任何不正确之处。您实际上并没有使用这些变量,所以没有问题。如果您确实尝试使用它们,那将成为一个问题。例如,
System.out.println(a2);
System.out.println(x);
会带来“变量'x'/'a2'可能没有被初始化”错误。将没有默认值或运行代码的能力。这将是一个编译时错误,您的代码将无法运行。如果变量是类字段,它们将获得某些类型或null
其他类型的默认值。
是的,只要您不访问它们,您在上述代码中所做的局部变量声明是允许的。如果您碰巧编写了访问这些变量的任何代码,则该代码将无法编译。
根据 Java 语言规范,您不能访问局部变量(您在方法中声明的变量),除非它们在访问之前被初始化。以下来自 SE 8 的 Java 语言规范。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4.1
第16章 - 明确的任务
“对于局部变量或空白最终字段 x 的每次访问,必须在访问之前明确分配 x,否则会发生编译时错误。”
第十四章
14.4.2 局部变量声明的执行 局部变量声明语句是可执行语句。每次执行时,声明符从左到右依次进行处理。如果一个声明器有一个初始化器,初始化器被计算并且它的值被赋值给变量。 如果声明器没有初始值设定项,则每次对变量的引用都必须在执行对变量的赋值之前执行,否则根据第 16 节(定义赋值)的规则会发生编译时错误。 只有在前一个初始化程序的评估正常完成时,才会评估每个初始化程序(第一个除外)。仅当最后一个初始化程序的评估正常完成时,局部变量声明的执行才能正常完成。如果局部变量声明不包含初始化程序,则执行它总是正常完成。
一旦开始使用未初始化的局部变量,就会出现编译时错误。例如:
案例1:没有错误
public static void doJob(int[] a){
int temp;
}
案例 2:给出错误
public static void doJob(int[] a){
int temp;
System.out.println(temp);
}
这两个变量都没有在代码中使用。一旦您尝试将其用作 System.out.println("Main" + x); 它会给你编译错误,因为局部变量没有初始化。