0

这是说我的局部变量newaccbalance可能尚未初始化。我知道我宣布它是双重的。请帮忙

 import java.util.*;

public class Pg244Problem12 {

  public static void main(String[] args) 
  { 

   int accnum, minbalance, currentbalance;
   int acctype;
   double newaccbalance;

   Scanner console = new Scanner(System.in);



   System.out.println("Enter the customer's account number:");
   accnum = console.nextInt();
   System.out.println("Enter the customer's account type by using the number 1 for Checking or 2 for Savings:");
   acctype = console.nextInt();
   System.out.println("Enter the minimum balance the customer's account can have:");
   minbalance = console.nextInt();
   System.out.println("Enter the current balance of the customer's account:");
   currentbalance = console.nextInt();



   // Checkings
    if(acctype == 1 && currentbalance >= (minbalance+5000)){
     newaccbalance = ((currentbalance*.05)*(1/12));
   }
    if (acctype == 1 && currentbalance >= minbalance && currentbalance <  (minbalance+5000)){
     newaccbalance = ((currentbalance*.03)*(1/12)); 
    }
    if (acctype == 1 && currentbalance < minbalance){
     newaccbalance = (currentbalance-25);
  }

   // Savings
    if (acctype == 2 && currentbalance >= minbalance){
      newaccbalance = ((currentbalance*.04)*(1/12));
    }
    if (acctype == 2 && currentbalance < minbalance){
      newaccbalance = (currentbalance - 10);
    }



    System.out.println("The account number is: "+ accnum);
    System.out.println("The account type is: "+ acctype);
    System.out.println("The current balance is: "+ currentbalance);
    System.out.println("The new account balance is: "+ newaccbalance);

  }
}
4

5 回答 5

3

首先,声明和初始化不是一回事。

double newaccbalance;声明变量。

newaccbalance = 42;正在初始化变量。

您的代码中的问题是编译器不能保证您的任何 if 语句都是正确的,因此可能newaccbalance未初始化。

我建议两件事:

首先,将变量初始化为默认值,double newaccbalance = 0;既要声明又要初始化变量。

其次,更改 if 语句的结构并使用 if-else-if,如下所示:

if (acctype == 1) {
    // For these if statements, acctype is 1 so we don't need to check that again
    if(currentbalance >= (minbalance+5000)){
        newaccbalance = ((currentbalance*.05)*(1/12));
    }
    else if (currentbalance >= minbalance) {
        //  && currentbalance <  (minbalance+5000) will be true because the above if-statement is **not** true
        newaccbalance = ((currentbalance*.03)*(1/12)); 
    }
    else { 
        // if (acctype == 1 && currentbalance < minbalance) would always be true here
        newaccbalance = (currentbalance-25);
    }
}
else if (acctype == 2){
     // Savings
     if (currentbalance >= minbalance) {
          newaccbalance = ((currentbalance*.04)*(1/12));
     }
     else { // currentbalance < minbalance) is always true here
          newaccbalance = (currentbalance - 10);
     }
}
else {
     // acctype is neither 1 or 2, what should we do now? RuntimeError, Catastrophic failure, the monsters are coming! We're screwed!
}
于 2013-10-12T20:42:53.583 回答
1

您正在声明您的变量。您需要初始化变量。

声明是您创建变量的地方:

double newaccbalance;

初始化是为变量赋值的地方:

newaccbalance = 0;

所以你需要做的是:

double newaccbalance = 0.0;
于 2013-10-12T20:43:51.317 回答
0

您的所有作业都包含在if控制结构中。如果没有任何条件被评估为true,则该变量将保持未分配状态。作为local变量,它也没有默认值。

这就是为什么消息说它可能未初始化的原因。

于 2013-10-12T20:44:30.250 回答
0

它没有被初始化。当您声明它时,请尝试 double newaccbalance = 0.0;

我认为问题是 newaccbalance 只是有条件地设置(在 if 语句中),所以永远不能保证它被设置为一个值。

初始化和声明是两件不同的事情。

于 2013-10-12T20:44:32.403 回答
0

我不认为你得到一个错误,而是一个警告。
无论如何,Java 是正确的。
您的变量 newaccbalance 可能尚未初始化。

您已将其声明为双精度,但您仅在 if 语句中为其分配了一个值。
Java 不知道这些 if 语句是否涵盖所有可能的情况,因此会警告您newaccbalance实际上可能未分配的内容。

请注意,Java 不会为未定义的变量分配零值。
你必须自己做。

将顶部声明更改为:

double newaccbalance = 0;  //Or whatever default value you want.

要么这样,要么else在最后一个后面添加一个额外的,如下所示:

else if (acctype == 2 && currentbalance < minbalance){
  newaccbalance = (currentbalance - 10);
}
else { newaccbalance = 0; }

这将确保编译器满意 newaccbalance 具有定义的值,而不是随机值。
您应该始终确保是这种情况,并且 kuddo 会注意警告并采取行动。
未定义的变量可能是很难追踪错误的来源,因为除了 1% 的情况外,该值通常会变成一些合理的值。因为代码的每次运行都是不同的,所以很难重现错误,更不用说诊断了。

这就是Java坚持的原因。

于 2013-10-12T20:45:33.377 回答