我正在学习Java,我知道在使用它时我必须初始化一个局部变量。但是,我刚从书中找到了代码,代码是: 我想知道为什么在这种情况下变量音量没有被初始化?
public static double cubeVolume(double sideLength)
{
double volume;
if (sideLength>=0)
{
volume=sideLength*sideLength*sideLength;
}
else
{
volume=0;
}
return volume;
}
答案 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;
}