Java初始化时出现意外行为

chr*_*isw 5 java

注意:我很清楚初始化它可以解决问题; 我只是假设编译器会遵循执行路径,并且看到foo实际上会在它建议'可能'不是的时候进行初始化.

我最初的假设是,如果长度从未超过3,我将永远不需要为它使用分配内存.

这永远不会用于生产,我只是好奇

请参阅以下示例: -

List<String> foo;

int length = 5;

if (length > 3)
{
    foo = new ArrayList<String>();
}

if (length > 4)
{
    foo.add("bar");
}
Run Code Online (Sandbox Code Playgroud)

为什么会导致显示以下内容?

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

当然,在分支之后,永远不会出现foo未初始化的情况.我知道如果我这样做: -

List<String> foo = null;
Run Code Online (Sandbox Code Playgroud)

没有编译问题,但为什么我需要这样做呢?

jlo*_*rdo 5

如果将输入块,编译器无法确定您是第一个.如果没有,那么foo将保持未初始化.你不能调用add未初始化的变量.您可以通过length最终决定来帮助编译器.然后编译器将知道if将执行第一个块.

final int length = 5;
Run Code Online (Sandbox Code Playgroud)


NIN*_*OOP 5

局部变量需要在其他地方使用之前进行初始化,因为默认情况下不会对其进行初始化.如果if()不是,那么该怎么true办?

if (length > 3)
{
    foo = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

编译器无法判断条件是否为真.

局部变量(§14.4,§14.13)必须在使用前通过初始化(§14.4)或赋值(§15.26)显式赋予一个值,编程方式可以使用定义规则进行验证.分配

正如@jlordo指出的那样,lengthas final会解决编译错误,因为在编译时本身编译器知道值length总是存在5,因此条件length>3总是true如此,因此局部变量将被初始化.