2013-11-25 2 views
2

Я пытаюсь реализовать систему оценки для теста с использованием перечисления и оператора switch, однако с текущим кодом у меня есть результат всегда «null». Я не вижу, где это произошло, может ли кто-нибудь помочь?Оператор switch, возвращающий значение null

public enum Grade { 
    A, B, C, D, E, U; 
} 
public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter the students mark:"); 
    int points = scan.nextInt(); 

    if (points < 0 || points > 200) { 
     System.out.println("Error! points must be between 0 & 200"); 
    } else { 
     System.out.println(findGrade(points)); 
    } 

} 

public static Grade findGrade(int points) { 
    switch (points) { 
     case 1: 
      if (points>= 0 && points <= 59) { 
       return Grade.valueOf("U"); 
      } 
     case 2: 
      if (points >= 60 && points <= 89) { 
       return Grade.valueOf("E"); 
      } 
     case 3: 
      if (points >= 90 && points <= 119) { 
       return Grade.valueOf("D"); 
      } 
     case 4: 
      if (points >= 110 && points <= 139) { 
       return Grade.valueOf("C"); 
      } 
     case 5: 
      if (points >= 140 && points <= 169) { 
       return Grade.valueOf("B"); 
      } 
      case 6: 
      if (points >= 170 && points <= 200) { 
       return Grade.valueOf("A"); 
      } 
     default: 
      return null; 
    } 
} 

} 
+4

Так что, если 'points' будет равно 2, вы проверка' если (точек > = 60 && points <= 89) '. Считаете ли вы, что это логика? –

+0

В чем смысл этого оператора switch? – Artur

+0

все еще нужен перерыв; для каждого случая см. мой ответ ниже –

ответ

2

При переключении на переменном с int типа говорит points, код, соответствующий случаю, n выполняется, когда значение points является n. Думаю, теперь вы можете понять, где ошибка. В настоящее время ни один из ваших случаев не будет соответствовать значению points, если он больше 6, поэтому значение будет null.

Понятно, что вы хотите реализовать случаи, которые выполняются для разных диапазонов. Один из способов реализации этого - сузить больший диапазон до меньшего диапазона, так что для вас легче писать записи для них. Например, диапазон [0, 59] можно сузить до [0, 5] путем деления points на 10. Аналогично для других диапазонов, вы можете сузить их, и писать случаи, подобные этим:

public static Grade findGrade(int points) { 
    int val = points/10; 

    switch (val) { 
     // 0 <= points <= 59 is same as 0 <= val <= 5 
     case 0: case 1: 
     case 2: case 3: 
     case 4: case 5: return Grade.valueOf("U"); 

     // 60 <= points <= 89 is same as 6 <= val <= 8 
     case 6: case 7: 
     case 8:   return Grade.valueOf("E"); 

     // like so 
    } 
} 
+0

Конечно, вы имеете в виду 'points/10'. – Zong

+0

@ZongZhengLi Упс. Исправлено спасибо :) –

+0

Плохая идея ИМХО - правильный ответ - просто не использовать 'switch'. – jwg

5

Давайте посмотрим на

switch (points) { 
    case 1: 
     if (points >= 0 && points <= 59) { 
      return Grade.valueOf("U"); 
     } 

То, что вы в основном говорят, является:

if (points == 1) { 
    if (points >= 0 && points <= 59) { 
     return Grade.valueOf("U"); 
    } 
} 

который бред какой то. В этом случае я не думаю, что вам нужно переключиться. Просто используйте:

if (points < 0) { 
    return null; 
} 
if (points <= 59) { 
    return Grade.valueOf("U"); 
} 
if (points <= 89) { 
    return Grade.valueOf("E"); 
} 
if (points <= 119) 
    return Grade.valueOf("D"); 
} 
... 
return null; 
2

Вам не нужен переключатель вообще. Просто положите if с в цепи, и это будет работать для вас:

if (points>= 0 && points <= 59) { 
    return Grade.valueOf("U"); 
} 
if (points >= 60 && points <= 89) { 
    return Grade.valueOf("E"); 
} 
if (points >= 90 && points <= 119) { 
    return Grade.valueOf("D"); 
} 
if (points >= 110 && points <= 139) { 
    return Grade.valueOf("C"); 
} 
if (points >= 140 && points <= 169) { 
    return Grade.valueOf("B"); 
} 
if (points >= 170 && points <= 200) { 
    return Grade.valueOf("A"); 
} 
return null; 

Идея switch утверждения, чтобы позволить вам основывать решение на множестве фиксированных значений или небольших диапазонов значений. В этом случае, однако, диапазон довольно большой, поэтому цепочка из if операторов выглядит как более подходящий вариант.

Учитывая задачу, которую вы реализуете, вы могли бы построить более короткое решение с таблицей перекодировки и цикл:

int[] limits = new int[] {59, 89, 119, 139, 169, 200}; 
String[] grades = new String[] {"U", "E", "D", "C", "B", "A"}; 
for (int i = 0 ; i != limits.length ; i++) 
    if (points <= limits[i]) 
     return grades[i]; 
return null; 
Смежные вопросы