将 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.
没错。例如,如果您输入 55
,getGradeFromGPA
将 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;
}
}
我从这个网站找到了关注者。我添加了一些代码来获取用户输入。但是在 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.
没错。例如,如果您输入 55
,getGradeFromGPA
将 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;
}
}