2013-12-08 3 views
-2

Я создаю класс Course, который представляет объект курса с тремя атрибутами, courseID, letterGrade и numberGrade.Почему этот оператор switch не распознает subString?

numberGrade рассчитано от letterGrade использованием метода computeGrade(). В настоящее время я тестирую свой класс Course и обнаруживаю, что оператор switch, используемый в computeGrade, не распознает соответствующий 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; 
} 

не является проблемой.

+2

Вы забыли добавить 'break;' заявления после каждого случая в вашем коммутаторе. Итак, независимо от того, что возвращает 'letterGrade.substring', вы всегда будете обращаться к случаю по умолчанию. –

ответ

5

Вы должны добавить break; после каждого case. Без этого ваша программа ползает до default, независимо от того, что находится в switch.

Читать docs, чтобы лучше понять включение случае statmenets:

Всех заявлений после согласования случая ярлыка не выполняется последовательно, независимо от выражения последующих этикеток, до перерыва Оператор встречается.

+0

Это не совсем правильно; хотя традиционно «switch» выполняется до тех пор, пока не будет найден разрыв, вы можете отбрасывать исключения в любой ветке, и это прекратит выполнение «switch». – Makoto

+0

@ Макото Вы правы. В его случае этого не произойдет. – Maroun

+0

Да, это правда. В этом контексте этого не произойдет вообще. – Makoto

3

Без использования break; после каждого case-statement переключатель будет использовать следующий случай до значения по умолчанию. Поэтому каждый раз, когда вы используете этот переключатель-заявление он будет работать до тех пор, default

2

То, что вы в настоящее время не является fall through случай - так как нет break встречается, ваш код всегда будет выполнять все отрасли, и будет то, что используется последний результат ,

Вы должны добавить break в конец вашего switch заявлений в этом контексте.

Смежные вопросы