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

时间:2014-04-06 17:18:07

标签: java

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

public static double cubeVolume(double sideLength)
{
    double volume;
    if (sideLength>=0)
    {
        volume=sideLength*sideLength*sideLength;
    }
    else
   {
      volume=0;
   }
   return volume;
}

3 个答案:

答案 0 :(得分:6)

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

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

实施例

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

好的(但没有意义):

double volume; //<--declared
volume=6;  //<--initialised
double volumeUsed=2*volume;

确定:

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

不行(使用时未知卷):

double volume;
double volumeUsed=2*volume;

不行(如果useUpper为false,则可能不知道 - 如果useUpper为false):

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

不行:在初始化之前使用

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

答案 1 :(得分:1)

因为在评估volume之前,作者没有if的任何值。

其他选项包括:

double volume = 16.0; // Random. Wrong. Bug-prone.

或:

double volume = 0.0; // Conveys that 0 is somehow a valid value. 
// or that another value might not be entered.

当然在这种情况下0.0确实是一个完全有效的值,所以这个选项没问题:

double volume = 0.0;
if(sideLength >= 0) {
    volume = sideLength * sideLength * sideLength;
}

但这可以提出这个问题,为什么我们设置volume两次呢?我认为不是什么大不了的事,但有些程序员可能不喜欢它。现在这已经提升了,但如果volume需要采用final修饰符,例如因为它稍后出现在封闭中,这将是非法的:

final double volume = 0.0;
if(sideLength >= 0) {
    volume = sideLength * sideLength * sideLength;  // compiler error
}

如果作者更喜欢简洁(我不推荐这里),这可以在一行中完成,如下所示:

double volume = sideLength >=0 ? sideLength * sideLength * sideLength : 0;

还有一个聪明的例子(这很糟糕,不要这样做):

double volume = Math.max(sideLength * sideLength * sideLength, 0);
// does not generalize to even dimensions

答案 2 :(得分:-2)

请改为:

public static double cubeVolume(double sideLength)
{
    double volume = 0;
    if (sideLength>=0)
    {
        volume=sideLength*sideLength*sideLength;
    }
   return volume;
}
相关问题