Java if语句,该特定代码是必需的还是冗余的?

Java if语句,该特定代码是必需的还是冗余的?,java,if-statement,Java,If Statement,有人能告诉我这个词的功能是什么吗 如果(月==null){ 返回月号; } 在下面的代码中。我在Java教程Oracle中看到了这段代码。我已经删除了上面的if语句,下面的代码工作得很好。如果声明是不必要的,或者由于我不知道的原因而包括在内 public class StringSwitchDemo { public static int getMonthNumber(String month) { int monthNumber = 0; if (month == nul

有人能告诉我这个词的功能是什么吗 如果(月==null){ 返回月号; } 在下面的代码中。我在Java教程Oracle中看到了这段代码。我已经删除了上面的if语句,下面的代码工作得很好。如果声明是不必要的,或者由于我不知道的原因而包括在内

public class StringSwitchDemo {

public static int getMonthNumber(String month) {

    int monthNumber = 0;

    if (month == null) {
        return monthNumber;
    }


    switch (month.toLowerCase()) {
        case "january":
            monthNumber = 1;
            break;
        case "february":
            monthNumber = 2;
            break;
        case "march":
            monthNumber = 3;
            break;
        case "april":
            monthNumber = 4;
            break;
        case "may":
            monthNumber = 5;
            break;
        case "june":
            monthNumber = 6;
            break;
        case "july":
            monthNumber = 7;
            break;
        case "august":
            monthNumber = 8;
            break;
        case "september":
            monthNumber = 9;
            break;
        case "october":
            monthNumber = 10;
            break;
        case "november":
            monthNumber = 11;
            break;
        case "december":
            monthNumber = 12;
            break;
        default: 
            monthNumber = 0;
            break;
    }

    return monthNumber;
}

public static void main(String[] args) {

    String month = "";

    int returnedMonthNumber =
        StringSwitchDemo.getMonthNumber(month);

    if (returnedMonthNumber == 0) {
        System.out.println("Invalid month");
    } else {
        System.out.println(returnedMonthNumber);
    }
}
}

这是必要的。如果您没有它,并且传递的月份是
null
,那么您将在这里使用
NullPointerException
开关(month.toLowerCase()){这是必要的。如果您没有它,并且传递的月份是
null
,那么您将在这里使用
NullPointerException
开关(month.toLowerCase()){

这就像在路边有一个防撞栏——没有人故意撞上它,所以它们不是严格必要的,但我们把它们放在那里,因为当发生意外错误时,它们有助于控制发生的情况。防撞栏阻止汽车远离道路并损坏其他人或建筑物

换言之,如果一切正常,这是不必要的——在您的示例中,一切都只能很好地工作——但在更大的代码中,许多事情都不顺利。许多人在匆忙中工作,很多人在疲惫时使用它,或者在不理解它的情况下使用它。编写代码时,好像事情会出错,然后防范它是一个idea被称为“防御性编程”,检查传递到函数中的参数实际上是您认为应该的参数,可以帮助提高可靠性,使程序更具弹性,总体错误更少,出现安全漏洞的可能性更低


这个问题、答案和链接对此有更多的想法-

这就像在路边有一个防撞栏-没有人故意撞上它们,所以它们不是严格必要的,但我们把它们放在那里,因为当发生意外错误时,它们有助于控制发生的事情。防撞栏阻止汽车远离道路破坏他人或建筑物

换言之,如果一切正常,这是不必要的——在您的示例中,一切都只能很好地工作——但在更大的代码中,许多事情都不顺利。许多人在匆忙中工作,很多人在疲惫时使用它,或者在不理解它的情况下使用它。编写代码时,好像事情会出错,然后防范它是一个idea被称为“防御性编程”,检查传递到函数中的参数实际上是您认为应该的参数,可以帮助提高可靠性,使程序更具弹性,总体错误更少,出现安全漏洞的可能性更低


此问题、答案和链接对此有更多了解-

根据您实际使用的方法,使用神奇返回值(
0
)指示无效参数可能不是最佳选项

如果是为了让调用者测试字符串是否是有效的月份名称,那么它是有效的,但是调用者必须始终检查
0
返回值。在这种情况下,需要使用
if
语句返回
0
作为空参数

如果调用方只应该调用具有有效月份名称的方法,则抛出异常会更好,在这种情况下,抛出
NullPointerException
是完全有效的。不过,您应该记录它:

/**
 * Returns the month number (1-12) of the given full month name.
 * 
 * @param month full name of month, e.g. {@code "january"}
 * @return month number (1-12)
 * @throws NullPointerException if {@code month} is null
 * @throws IllegalArgumentException if {@code month} is not a valid month name
 */
public static int getMonthNumber(String month) {
    switch (month.toLowerCase()) {
        case "january":   return 1;
        case "february":  return 2;
        case "march":     return 3;
        case "april":     return 4;
        case "may":       return 5;
        case "june":      return 6;
        case "july":      return 7;
        case "august":    return 8;
        case "september": return 9;
        case "october":   return 10;
        case "november":  return 11;
        case "december":  return 12;
        default: throw new IllegalArgumentException("Invalid month: " + month);
    }
}
如果您不希望出现异常,并且您使用的是Java 8,那么您可能希望使用new命令强制调用方检查特殊返回值:

public static Optional<Integer> getMonthNumber(String month) {
    if (month != null)
        switch (month.toLowerCase()) {
            case "january":   return Optional.of(1);
            case "february":  return Optional.of(2);
            case "march":     return Optional.of(3);
            case "april":     return Optional.of(4);
            case "may":       return Optional.of(5);
            case "june":      return Optional.of(6);
            case "july":      return Optional.of(7);
            case "august":    return Optional.of(8);
            case "september": return Optional.of(9);
            case "october":   return Optional.of(10);
            case "november":  return Optional.of(11);
            case "december":  return Optional.of(12);
        }
    return Optional.empty();
}
public静态可选getMonthNumber(字符串月份){
如果(月!=null)
开关(month.toLowerCase()){
案例“一月”:第(1)项的可选返回;
案例“二月”:第(2)项的可选返回;
案例“三月”:返回可选。共(3);
案例“april”:第(4)项的可选返回;
案例“可能”:返回可选。共(5);
案例“6月”:第(6)项的可选择返回;
案例“7月”:第(7)项的可选择返回;
案例“八月”:第(8)项中的可选择返回;
“9月”一案:第(9)项的可选择返回;
案例“10月”:可选择返回(10);
“11月”一案:第(11)项的可选择返回;
案例“12月”:可选择返回(12);
}
返回可选的.empty();
}

根据您实际使用的方法,使用神奇返回值(
0
)指示无效参数可能不是最佳选择

如果是为了让调用者测试字符串是否是有效的月份名称,那么它是有效的,但是调用者必须始终检查
0
返回值。在这种情况下,需要使用
if
语句返回
0
作为空参数

如果调用方只应该调用具有有效月份名称的方法,则抛出异常会更好,在这种情况下,抛出
NullPointerException
是完全有效的。不过,您应该记录它:

/**
 * Returns the month number (1-12) of the given full month name.
 * 
 * @param month full name of month, e.g. {@code "january"}
 * @return month number (1-12)
 * @throws NullPointerException if {@code month} is null
 * @throws IllegalArgumentException if {@code month} is not a valid month name
 */
public static int getMonthNumber(String month) {
    switch (month.toLowerCase()) {
        case "january":   return 1;
        case "february":  return 2;
        case "march":     return 3;
        case "april":     return 4;
        case "may":       return 5;
        case "june":      return 6;
        case "july":      return 7;
        case "august":    return 8;
        case "september": return 9;
        case "october":   return 10;
        case "november":  return 11;
        case "december":  return 12;
        default: throw new IllegalArgumentException("Invalid month: " + month);
    }
}
如果您不希望出现异常,并且您使用的是Java 8,那么您可能希望使用new命令强制调用方检查特殊返回值:

public static Optional<Integer> getMonthNumber(String month) {
    if (month != null)
        switch (month.toLowerCase()) {
            case "january":   return Optional.of(1);
            case "february":  return Optional.of(2);
            case "march":     return Optional.of(3);
            case "april":     return Optional.of(4);
            case "may":       return Optional.of(5);
            case "june":      return Optional.of(6);
            case "july":      return Optional.of(7);
            case "august":    return Optional.of(8);
            case "september": return Optional.of(9);
            case "october":   return Optional.of(10);
            case "november":  return Optional.of(11);
            case "december":  return Optional.of(12);
        }
    return Optional.empty();
}
public静态可选getMonthNumber(字符串月份){
如果(月!=null)
开关(month.toLowerCase()){
案例“一月”:第(1)项的可选返回;
案例“二月”:第(2)项的可选返回;
案例“三月”:返回可选。共(3);
案例“april”:第(4)项的可选返回;
案例“可能”:返回可选。共(5);
案例“6月”:第(6)项的可选择返回;
案例“7月”:第(7)项的可选择返回;
案例“八月”:第(8)项中的可选择返回;
“9月”一案:第(9)项的可选择返回;
案例“10月”:可选择返回(10);
“11月”一案:第(11)项的可选择返回;
案例“12月”:可选择返回(12);
}
返回可选的.empty(