错误:变量可能尚未初始化

时间:2014-05-05 14:28:57

标签: java

收到错误:

  

Pay.java:81:错误:变量hourlyWage可能没有   已初始化JOptionPane.showMessageDialog(null, hourlyWage);

以下代码。声明了双hourlyWage,这些语句在主参数内。不知道我错过了什么,是吗?

if(skillInt == 1){
    hourlyWage = 17.00;
} else if(skillInt == 2){
    hourlyWage = 20.00;
} else if(skillInt == 3){
    hourlyWage = 22.00;
}
JOptionPane.showMessageDialog(null, hourlyWage);

5 个答案:

答案 0 :(得分:7)

消息指出,可能(如果skillInt不在{1, 2, 3}中)您使用的变量(hourlyWage)未初始化。首先用一些值初始化它:

hourlyWage = 0;
if (skillInt == 1)
    //...

或添加else阻止:

//...
else if (skillInt == 3)
    hourlyWage = 22.0;
else
    hourlyWage = 0;

如果skillInt的唯一可能值为{1,2,3},那么您可能希望仅使用if移动第三个else块:

//...
else {
    hourlyWage = 22.0;
}

顺便说一下,更好的方法是switch运算符:

switch (skillInt) {
    case 1 : hourlyWage = 17.0;
        break;
    case 2 : hourlyWage = 20.0;
        break;
    case 3 : hourlyWage = 12.0;
        break;
    default : hourlyWage = Double.POSITIVE_INFINITY;
}

答案 1 :(得分:2)

hourlyWageif语句中获取其值。所以有可能,这条线很滑。

if之前添加默认初始化,如:

double hourlyWage = 0.0;

只有在所有执行分支中,在读取变量之前将值写入变量时,才能声明没有值的变量。因此,在else分支中添加值也可以解决您的问题。仅在else if分支中添加值类似于仅使用if分支。

答案 2 :(得分:1)

您需要发起hourlyWage

double hourlyWage = 0;     // or some other value
if(skillInt == 1) {
// ...

答案 3 :(得分:1)

编译器表示它认为可能的代码路径意味着在没有初始化的情况下使用了变量。

首选修复方法是在创建时将其初始化为默认值,但如果失败,请确保if / else链以无条件else块结束,并设置默认值。

答案 4 :(得分:0)

在您的代码中,如果skillInt不等于1,2或3,则根本不会分配hourlyWage。如果hourlyWage的合适默认值适用于除了1,2或3之外的每个可能的技能值,您可以通过在if / else(double hourlyWage = XX.XX;)上方设置或通过设置它来设置无条件的其他分支:} else { hourlyWage = XX.XX; }。 (替换XX的默认值。)

我正在发帖,因为这里的其他四个答案忽略了一些重要的事情。

如果(似乎更有可能)当skillInt具有未被理解的值时,没有使用正确的hourlyWage默认值,则盲目地将hourlyWage设置为0或其他一些无效值,并可能继续进行进一步处理无法产生正确的结果,只会加剧已经存在的错误。如果该方法无法使用skillInt的当前值,唯一正确的做法是中止处理,例如throwing an exception

if (skillInt == 1) {
    hourlyWage = 17.00;
} else if (skillInt == 2) {
    hourlyWage = 20.00;
} else if (skillInt == 3) {
    hourlyWage = 22.00;
} else {
    throw new IllegalArgumentException("Skill value out of range");
}

另请注意,浮点数据类型不精确且are never suitable for currency values in real-world applications。在实际应用程序中,您必须使用BigDecimal类型作为货币值。