我正在编写一个简单的方法,将成绩作为用户的输入并计算成绩点平均值.这是我的代码:
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和之间的价值观A
和D
做totalGradePoints += ('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)