将 switch 语句与枚举一起使用

Using switch statement with enumeration

我从这个网站找到了关注者。我添加了一些代码来获取用户输入。但是在 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;
        }
    }

我认为 return getGradeFromGPA() 方法没有任何作用。

I think it doesn't return anything by getGradeFromGPA() method.

没错。例如,如果您输入 55getGradeFromGPA 将 return null

请注意,有些双打无法准确表示,因此如果您输入 2.49,例如,这也会产生 null

(此外,您似乎已经交换了 PASS 枚举的参数。)

How to fix this?

关于 double 的问题,我建议你这样做:

private enum Grade {
    FIRST_CLASS(3.5),
    TWO_ONE(3),
    TWO_TWO(2.5),
    PASS(2),
    FAIL(0);

    private final double minGPA;

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

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

不过,您输入 55 时的情况仍然需要处理。最好的方法可能是使用例外:

static Grade getGradeFromGPA(double gpa) {
    for (Grade grade : Grade.values()) {
        if (gpa > grade.minGPA)
            return grade;
    }
    //invalid GPA
    throw new IllegalArgumentException();  // <----------
}

try {
    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;
    }
} catch (IllegalArgumentException e) {
    System.out.println("Invalied GPA");
}

如果您输入无效的 GPA,Grade.getGradeFromGPA(gpa) 将 return 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;
    }
}