java变量作用域,变量可能尚未初始化

11dmarpk  于 2021-06-29  发布在  Java
关注(0)|答案(3)|浏览(400)

我在学习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 .
我应该如何理解代码中的作用域?

dgjrabp2

dgjrabp21#

因为不能确保变量c总是在循环中初始化。例如,如果您的代码如下所示:

public class HelloWorld {
    public static void main(String[] args) {
        int c;
        for (int i=0; i <0; i++) {
            System.out.println(i);
            c = 100;
        }
        System.out.println(c);
    }
}

代码永远不会到达循环,那么变量c就永远不会初始化。这就是为什么java语言要求在循环外使用变量时在循环外初始化变量。

jfewjypa

jfewjypa2#

在java中,局部变量不是用默认值初始化的(不像类的字段)。从语言规范一(§4.12.5)可以阅读以下内容:
局部变量(§14.4, §14.14)必须在使用之前通过初始化或(§14.4)或转让(§15.26),以可使用明确分配规则验证的方式(§16(明确分配)。
因为它是在java语言规范中显式设置的,所以编译器不会(也不应该)推断变量 c 将始终在循环内更新:

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);
    }
}

编译器严格执行该标准,并通知您已违反其中一条规则并出现以下错误:

"variable c might not have been initialized"

因此,即使您的代码可以被正式证明是有效的,编译器的工作也不是试图分析应用程序的逻辑,局部变量初始化规则也不依赖于此。编译器检查变量 c 根据局部变量初始化规则初始化,并做出相应的React(例如,在 int c; ).

uajslkp6

uajslkp63#

这不是范围问题。变量c是方法范围内的,在整个main方法中可用。这是一个编译器功能。在编译时,它不能检查“for”循环是否至少运行一次来初始化变量。这就是为什么它说,当您试图打印变量时,该变量可能尚未初始化。所以c可用于打印方法,但编译器不确定它是否已初始化。

相关问题