Java if语句,该特定代码是必需的还是冗余的?
有人能告诉我这个词的功能是什么吗 如果(月==null){ 返回月号; } 在下面的代码中。我在Java教程Oracle中看到了这段代码。我已经删除了上面的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
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(