为什么这段代码不能按预期工作?

use*_*506 0 java if-statement

我正在编写一个简单的方法,将成绩作为用户的输入并计算成绩点平均值.这是我的代码:

public static double calculateGPA(){
   Scanner in = new Scanner(System.in);

   double totalGradePoints = 0; // total grade points
   int numClasses = 0; // total classes completed
   boolean doneInput = false; // returns true when use is done inputting grades

   System.out.println("Enter all your grades (A,B,C,D,F) and enter 'done' if you are done entering your grades.");  
   while (!doneInput) {     
      String grade = in.next();

      if (grade == "A") {
         totalGradePoints += 4;
         numClasses++;
      } else if (grade == "B") {
         totalGradePoints += 3;
         numClasses++;
      } else if(grade == "C") {
         totalGradePoints += 2;
         numClasses++;
      } else if(grade == "D") {
         totalGradePoints += 1;
         numClasses++;
      } else if(grade == "F") {
         numClasses++;
      } else {
         doneInput = true;
      } //end if - else-if - else statement
   }//end while loop
   double unwtGPA = (totalGradePoints/numClasses);
   return unwtGPA;
}
Run Code Online (Sandbox Code Playgroud)

当我测试该方法时,我只能输入一个等级并且没有任何变量递增,有人可以告诉我代码有什么问题吗?

Jan*_*net 11

问题在于使用字符串比较==代替equals.==比较参考,这些参考不太可能相等.改成

 if(grade.equals("A")){
        totalGradePoints += 4;
        numClasses++;
    }else if(grade.equals("B")){ ...
Run Code Online (Sandbox Code Playgroud)

它应该工作.有关详细说明,请参阅此答案.

作为一种好的做法,建议始终使用静态字符串作为调用equals on的对象来防止NPE:

 if("A".equals(grade)){
        totalGradePoints += 4;
        numClasses++;
    }else if("B".equals(grade)){ ...
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Java 7,您还可以switch使用字符串执行语句(但如果grade为null,则会抛出一个NPE):

switch(grade) {
    case "A":
        totalGradePoints += 2;
        numClasses++;
        break;
    case "B":
        ...
}
Run Code Online (Sandbox Code Playgroud)

最后,因为你将只有一个字母为整数,以最好的解决办法是将它们转换成char和之间的价值观ADtotalGradePoints += ('D' - grade.charAt(1)) + 1.所以,沿着这些方向阅读IMO最简单:

while (true) {        
    final String input = in.next();
    if(input == null || input.isEmpty())
        break;

    final char grade = input.charAt(0);
    if(grade >= 'A' && grade <= 'D') {
        totalGradePoints += ('D' - grade) + 1;
    } else if(grade == 'F') {
        // no gradepoints for 'F'
    } else {
        break;
    } //end if - else-if - else statement

    ++numClasses;
} //end while loop
Run Code Online (Sandbox Code Playgroud)

  • 或者,更好的是,"切换". (2认同)
  • @huseyintugrulbuyukisik不是Java,它没有. (2认同)