当前位置: 首页 > 知识库问答 >
问题:

Java:为什么我需要初始化原始局部变量?

邵璞
2023-03-14
public class Foo {
    public static void main(String[] args) {
        float f;
        System.out.println(f);
    }
}

print语句会导致以下编译时错误,

局部变量f可能尚未初始化

如果Java中的原语已经有一个默认值(float=0.0f),为什么我需要定义一个呢?

所以,这是有效的

public class Foo {
    float f;
    public static void main(String[] args) {
        System.out.println(new Foo().f);
    }
}

谢谢大家!

共有3个答案

慕乐池
2023-03-14

类字段(非最终字段)初始化为默认值。局部变量不是。

声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值。

所以在

class C {
  float f;
}

将被初始化为0f但是本地变量f

void myMethod() {
  float f;
}

不会的。

语言对局部变量的处理不同于字段。局部变量的生存期范围很广,所以初始化前的任何使用都可能是错误的。字段没有,所以默认初始化通常很方便。

丌官博文
2023-03-14

事实上,编译器不会为您的浮点f指定默认值,因为在本例中,它是一个局部变量,而不是一个字段:

局部变量略有不同;编译器从不为未初始化的局部变量指定默认值。如果无法在声明局部变量的位置初始化它,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

唐晗昱
2023-03-14

因为它是一个局部变量。这就是为什么没有给它分配任何东西:

局部变量略有不同;编译器从不为未初始化的局部变量指定默认值。如果无法在声明局部变量的位置初始化它,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

编辑:为什么Java会出现这个编译错误?如果我们看一下标识表达式。java类文件,我们将找到以下块:

...
if (field.isLocal()) {
            LocalMember local = (LocalMember)field;
            if (local.scopeNumber < ctx.frameNumber && !local.isFinal()) {
                env.error(where, "invalid.uplevel", id);
            }
            if (!vset.testVar(local.number)) {
                env.error(where, "var.not.initialized", id);
                vset.addVar(local.number);
            }
            local.readcount++;
        }
...

如上所述(if(!vset.testVar(local.number)){),JDK(使用testVar)检查变量是否被分配(vset)的源代码,我们可以在那里找到testVar代码)。如果没有,它会从属性文件中引发错误var.not.initialized

...
javac.err.var.not.initialized=\
    Variable {0} may not have been initialized.
...

来源

 类似资料:
  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访

  • 如果我在我的类中创建一个bool,就像一样,它默认为false。 当我在我的方法中创建相同的bool时,我得到一个错误“使用未分配的局部变量检查”。为什么?

  • 下面的示例类无法编译: 此代码的编译错误消息是: 但是,对于包含以下方法的类,Java不会生成任何错误消息: 关于初始化及其要求,为什么Java对最终实例变量和最终局部变量的处理不同?谢谢

  • 问题内容: Java的设计者是否有任何理由认为不应为局部变量提供默认值?认真地讲,如果实例变量可以被赋予默认值,那为什么我们不能对局部变量做同样的事情呢? 问题答案: 声明局部变量主要是为了进行一些计算。因此,程序员决定设置变量的值,并且不应采用默认值。如果程序员错误地没有初始化局部变量并且使用默认值,则输出可能是一些意外值。因此,在使用局部变量的情况下,编译器将要求程序员在访问变量之前使用一些值

  • 我对python相当陌生,我想知道局部变量是如何工作的。让我们从一个简单方法的示例开始: 让我们假设local_dict像一种常量变量一样使用。这里有一个问题:它是在每次调用do_sth()时创建的,还是创建一次并保存在do_sth()内部的某个地方?

  • 问题内容: 当我只是尝试使用 Java 编写一些程序时,我尝试使用变量,我知道变量必须在声明时进行初始化,但是在main方法内部它接受了没有初始化的变量。我不知道是什么原因。任何人都可以告诉我原因。 谢谢 码: 问题答案: 对于 实例变量水平 最终变量只能初始化一次。 必须 在构造函数结束之前 初始化类级别的最终变量。 对于 本地(方法)级别 方法级别的最终变量只能初始化一次。 使用前* 必须先初