为什么即使分配将在以后发生,也需要初始化String?

inf*_*ous 1 java string initialization

我使用以下代码获取"本地变量字符串可能尚未初始化"错误.代码本身没有意义,它只是为了锻炼而编写的.

public class StringExercise
{
    public static void main(String[] args)
    {
        String string; // initializing here fixes the issue
        for (int i = 0; i < 10; ++i)
        {
            if( (i % 4) == 2 )
            {
                string = "Number: " + i;
            }
        }
        System.out.println(string); // this is marked as wrong by Eclipse
    }
}
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,初始化String就足够了,如上面的注释中所表达的那样.

我的问题是为什么需要它?该方法println永远不会被赋予null,并且在循环中的条件第一次返回true时将发生初始化.我做错了什么或只是Java对程序员的错误过于谨慎?如果是后者,从理论的角度来看,它是如何合理的呢?

fge*_*fge 7

我的问题是为什么需要它?

因为即使您的代码是"逻辑"编写的,因此string确实会在循环中初始化,编译器也不知道它.它看到的只是:

for (loop; elements; here)
    if (someCondition)
        string = something;
Run Code Online (Sandbox Code Playgroud)

简而言之:编译器不会检查代码的逻辑; 它只有足够聪明才能检查语法错误,但在此之后,字节码生成本身就是"哑".

并且由于Java要求在使用之前初始化所有变量,因此会出现此编译器错误.

  • C++(和C就此而言)对`auto`变量有不同的看法; 如果它们未初始化,则它们具有未确定的值.Java _requires_在使用之前初始化局部变量. (2认同)