为什么这个局部变量不是用Java初始化的?

use*_*084 3 java

我正在学习Java,我知道在使用它时我必须初始化一个局部变量.但是,我刚刚从书中找到了一个代码,代码是:我想知道为什么在这种情况下变量量没有被初始化?

public static double cubeVolume(double sideLength)
{
    double volume;
    if (sideLength>=0)
    {
        volume=sideLength*sideLength*sideLength;
    }
    else
   {
      volume=0;
   }
   return volume;
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*gle 6

规则是它必须在使用之前初始化,因为if语句的两个分支volume在返回(也就是使用)之前已经初始化,编译器可以保证它在被使用之前已经初始化.

如果您尝试volume在if语句之前使用,则会再次收到该编译错误.同样道理,如果它不是在所有分支初始化(在这种情况下,如果声明的两侧),你会得到错误.

例子

以下示例可能会在可能出现问题时给出一些煽动:

好的(但毫无意义):

double volume; //<--declared
volume=6;  //<--initialised
double volumeUsed=2*volume;
Run Code Online (Sandbox Code Playgroud)

好:

boolean useUpper=true; //<-- useUpper declared and initialised
double volume;
if (useUpper){
    volume=6; //<--initialised
}else{
    volume=7; //<--initialised
}
double volumeUsed=2*volume;
Run Code Online (Sandbox Code Playgroud)

不行(使用时未知卷):

double volume;
double volumeUsed=2*volume;
Run Code Online (Sandbox Code Playgroud)

不行(使用时可能不知道音量- 如果useUpper为false):

boolean useUpper=true;
double volume;
if (useUpper){
    volume=6; //<--initialised
}
//volume may not be initialised
double volumeUsed=2*volume;
Run Code Online (Sandbox Code Playgroud)

不行:在初始化之前使用

double volume;
double volumeUsed=2*volume;
if (sideLength>=0)
{
    volume=sideLength*sideLength*sideLength; //<--initialised (too late)
}
else
{
   volume=0;
}
return volume;
Run Code Online (Sandbox Code Playgroud)