我正在创建一个类Course
,它表示一个包含三个属性courseID
,letterGrade
和numberGrade
的Course对象。
numberGrade
使用letterGrade
方法从computeGrade()
计算得出。我目前正在测试我的Course
类,并发现computeGrade
中使用的switch语句无法识别相关的substring
。
为什么会这样?
public void computeGrade() {
switch (letterGrade.substring(0,1)) {
case "A": numberGrade = 4.0;
case "B": numberGrade = 3.0;
case "C": numberGrade = 2.0;
case "D": numberGrade = 1.0;
case "F": numberGrade = 0.0;
default: numberGrade = 999;
}
if(letterGrade.endsWith("+") && !letterGrade.startsWith("A") && !letterGrade.startsWith("F")) {
numberGrade += 0.3;
}
else if(letterGrade.endsWith("-") && !letterGrade.startsWith("D") && !letterGrade.startsWith("F")) {
numberGrade -= 0.3;
}
}
我的测试人员循环了一系列可能的等级
public static void main(String[] args) {
String[] grades = {"A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "F"};
Course course = new Course("COP2253", " ");
String toString;
for (int i = 0; i < grades.length; i++) {
course.updateGrade(grades[i]);
toString = course.toString();
System.out.println(toString + "\n");
}
使用以下输出
COP2253 A 999.0
COP2253 A- 998.7
COP2253 B+ 999.3
COP2253 B 999.0
COP2253 B- 998.7
COP2253 C+ 999.3
COP2253 C 999.0
COP2253 C- 998.7
COP2253 D+ 999.3
COP2253 D 999.0
COP2253 F 999.0
P.S。我很确定构造函数,
public Course(String courseID, String letterGrade) {
this.courseID = courseID;
this.letterGrade = letterGrade;
computeGrade();
}
updateGrade()
,
public void updateGrade(String grade) {
letterGrade = grade;
computeGrade();
}
和toString()
public String toString() {
String grade = courseID + "\t\t" + letterGrade + "\t" + numberGrade;
return grade;
}
不是问题。
答案 0 :(得分:5)
您应该在每个案例之后添加break;
。没有它,无论default
中的内容是什么,您的程序都会抓取到switch
。
阅读docs以更好地了解 switch-case statmenets:
匹配案例标签后的所有语句按顺序执行, 无论后续案例标签的表达如何,直到休息 遇到陈述。
答案 1 :(得分:3)
在每个case语句后不使用break;
,switch将使用下一个案例直到默认值。因此,每次使用此switch语句时,它都会一直运行到default
答案 2 :(得分:2)
您目前拥有的是fall through案例 - 由于没有遇到break
,您的代码将始终执行每个分支,最后的结果将是使用的。
您必须将break
添加到此上下文中switch
语句的末尾。