java - 将 switch 语句与枚举一起使用

标签 java enums

我从这个网站上发现了以下内容。我添加了一些代码来获取用户输入。但是在 switch 语句的开头有一个名为 NullPointerExecption 的异常。

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        double gpa;
        System.out.println("Enter your GPA: ");
        gpa = input.nextDouble();
        Grade grade = Grade.getGradeFromGPA(gpa);



        switch (grade) {
            case FIRST_CLASS:   System.out.println("First class Hons"); break;
            case TWO_ONE:       System.out.println("upper Second class Hons"); break;
            case TWO_TWO:       System.out.println("Lower Second class Hons"); break;
            case PASS:          System.out.println("Pass"); break;
            case FAIL:          System.out.println("Fail"); break;
            default:            System.out.println("Invalied GPA");
        }
    }

    private enum Grade {
        FIRST_CLASS(3.5, 4),
        TWO_ONE(3, 3.49),
        TWO_TWO(2.5, 2.99),
        PASS(2.49, 2),
        FAIL(0, 1.99);

        private final double minGPA;
        private final double maxGPA;

        Grade(final double minGPA, final double maxGPA) {
            this.minGPA = minGPA;
            this.maxGPA = maxGPA;
        }

        static Grade getGradeFromGPA(double gpa) {
            for (Grade grade : Grade.values()) {
                if (grade.maxGPA >= gpa && grade.minGPA <= gpa) {
                    return grade;
                }
            }
            //invalid GPA
            return null;
        }
    }

我认为它不会通过 getGradeFromGPA() 方法返回任何内容。

最佳答案

如果您输入无效的 GPA,Grade.getGradeFromGPA(gpa) 将返回 null,并且不能在 switch 语句中使用。

如果您愿意,您可以明确地处理它:

Grade grade = Grade.getGradeFromGPA(gpa);

if (grade == null) {
    System.out.println("Invalid GPA");
}
else {
    switch (grade) {
        case FIRST_CLASS:   System.out.println("First class Hons"); break;
        case TWO_ONE:       System.out.println("upper Second class Hons"); break;
        case TWO_TWO:       System.out.println("Lower Second class Hons"); break;
        case PASS:          System.out.println("Pass"); break;
        case FAIL:          System.out.println("Fail"); break;
    }
}

关于java - 将 switch 语句与枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524096/

相关文章:

java - 非阻塞延迟队列,Java

java - 如何增加变量的值

java - EJB 两个单例相互调用死锁

java - 创建 DRY 枚举

c# - 在 C# 中使用枚举作为泛型类型参数

java - 为什么类不能扩展枚举?

java - 为什么枚举上的开关需要默认值?

java - 在 Spring 中,服务层总是必须是事务性的吗?

java - 我可以为 JPA 实体中的大型对象选择 File 或 InputStream 吗?

java - ParseEnum(方法)无法从 SuperCSV (Java) 中的 .csv 文件解析/读取字符串作为枚举