Switch语句返回null

时间:2013-11-25 19:06:17

标签: java enums switch-statement case

我正在尝试使用enum和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;
    }
}

}

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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 } } 。类似地,对于其他范围,您可以缩小范围,并编写如下情况:

{{1}}

答案 2 :(得分: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;