Uninitialized local variable - No error : Java
Uninitialized local variable - No error : Java
这里有两个未初始化的局部变量。这仍然不会给出编译时间或运行时错误并完全执行。这件事在Java中是否允许以及如何(欢迎解释)。
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);
会导致"Variable 'x'/'a2' might not have been intitialized"错误。将没有默认值或 运行 代码的能力。这将是一个编译时错误,您的代码不会 运行。如果变量是 class 字段,它们将获得某些类型的默认值或 null
否则。
这两个变量都没有在代码中使用。一旦您尝试将其用作 System.out.println("Main" + x);它会给你编译错误,因为局部变量没有初始化。
是的,您在上述代码中所做的局部变量声明是允许的,只要您不访问它们即可。如果您碰巧编写了任何访问这些变量的代码,代码将无法编译。
根据 Java 语言规范,您不能访问局部变量(您在方法中声明的变量),除非它们在访问之前被初始化。以下来自 Java SE 8 的语言规范。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4.1
第 16 章 - 明确赋值
"对于局部变量或空白final字段x的每次访问,x必须是明确的
在访问之前分配,否则会发生编译时错误。"
第十四章
14.4.2 局部变量声明的执行
局部变量声明语句是可执行语句。每次都是
执行时,声明符按从左到右的顺序处理。如果声明符
有一个初始化器,初始化器被评估并将其值分配给变量。
如果声明符没有初始值设定项,则对变量的每个引用都必须是
在执行对变量的赋值之前,或者发生编译时错误
§16(明确分配)的规则。
每个初始化器(第一个除外)仅在评估前一个时才被评估
初始化程序正常完成。
只有在求值时,局部变量声明的执行才能正常完成
最后一个初始化程序正常完成。
如果局部变量声明不包含初始值设定项,则始终执行它
正常完成。
一旦开始使用未初始化的局部变量,您将收到 compile-time 错误。例如:
情况一:无错误
public static void doJob(int[] a){
int temp;
}
情况 2:给出错误
public static void doJob(int[] a){
int temp;
System.out.println(temp);
}
这里有两个未初始化的局部变量。这仍然不会给出编译时间或运行时错误并完全执行。这件事在Java中是否允许以及如何(欢迎解释)。
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);
会导致"Variable 'x'/'a2' might not have been intitialized"错误。将没有默认值或 运行 代码的能力。这将是一个编译时错误,您的代码不会 运行。如果变量是 class 字段,它们将获得某些类型的默认值或 null
否则。
这两个变量都没有在代码中使用。一旦您尝试将其用作 System.out.println("Main" + x);它会给你编译错误,因为局部变量没有初始化。
是的,您在上述代码中所做的局部变量声明是允许的,只要您不访问它们即可。如果您碰巧编写了任何访问这些变量的代码,代码将无法编译。
根据 Java 语言规范,您不能访问局部变量(您在方法中声明的变量),除非它们在访问之前被初始化。以下来自 Java SE 8 的语言规范。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4.1
第 16 章 - 明确赋值
"对于局部变量或空白final字段x的每次访问,x必须是明确的 在访问之前分配,否则会发生编译时错误。"
第十四章
14.4.2 局部变量声明的执行 局部变量声明语句是可执行语句。每次都是 执行时,声明符按从左到右的顺序处理。如果声明符 有一个初始化器,初始化器被评估并将其值分配给变量。 如果声明符没有初始值设定项,则对变量的每个引用都必须是 在执行对变量的赋值之前,或者发生编译时错误 §16(明确分配)的规则。 每个初始化器(第一个除外)仅在评估前一个时才被评估 初始化程序正常完成。 只有在求值时,局部变量声明的执行才能正常完成 最后一个初始化程序正常完成。 如果局部变量声明不包含初始值设定项,则始终执行它 正常完成。
一旦开始使用未初始化的局部变量,您将收到 compile-time 错误。例如:
情况一:无错误
public static void doJob(int[] a){
int temp;
}
情况 2:给出错误
public static void doJob(int[] a){
int temp;
System.out.println(temp);
}