我在学习java,我知道java变量的作用域,比如类级、方法级、块级。然而,当我尝试实践变量作用域时,我在代码中遇到了错误。我的代码如下:
public class HelloWorld {
public static void main(String[] args) {
int c;
for (int i=0; i <5; i++) {
System.out.println(i);
c = 100;
}
System.out.println(c);
}
}
当我运行此代码时,它会显示错误: the c variable might not have been initialized
,但当我将代码更改为以下内容时:
public class HelloWorld {
public static void main(String[] args) {
int c=0;
for (int i=0; i <5; i++) {
System.out.println(i);
c = 100;
}
System.out.println(c);
}
}
代码将打印出来 100
.
我应该如何理解代码中的作用域?
3条答案
按热度按时间dgjrabp21#
因为不能确保变量c总是在循环中初始化。例如,如果您的代码如下所示:
代码永远不会到达循环,那么变量c就永远不会初始化。这就是为什么java语言要求在循环外使用变量时在循环外初始化变量。
jfewjypa2#
在java中,局部变量不是用默认值初始化的(不像类的字段)。从语言规范一(§4.12.5)可以阅读以下内容:
局部变量(§14.4, §14.14)必须在使用之前通过初始化或(§14.4)或转让(§15.26),以可使用明确分配规则验证的方式(§16(明确分配)。
因为它是在java语言规范中显式设置的,所以编译器不会(也不应该)推断变量
c
将始终在循环内更新:编译器严格执行该标准,并通知您已违反其中一条规则并出现以下错误:
因此,即使您的代码可以被正式证明是有效的,编译器的工作也不是试图分析应用程序的逻辑,局部变量初始化规则也不依赖于此。编译器检查变量
c
根据局部变量初始化规则初始化,并做出相应的React(例如,在int c;
).uajslkp63#
这不是范围问题。变量c是方法范围内的,在整个main方法中可用。这是一个编译器功能。在编译时,它不能检查“for”循环是否至少运行一次来初始化变量。这就是为什么它说,当您试图打印变量时,该变量可能尚未初始化。所以c可用于打印方法,但编译器不确定它是否已初始化。