如果声明,这个特定代码是必要的还是多余的?

时间:2015-11-26 05:33:57

标签: java if-statement

有人可以告诉我它的功能是什么     if(month == null){             return monthNumber;         } 在下面的代码中。我在Java教程Oracle中看到了这段代码。我删除了上面的if语句,下面的代码工作得很好。 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);
    }
}
}

3 个答案:

答案 0 :(得分:3)

这是必要的。如果您没有,月份通过null,那么您最终会NullPointerException switch (month.toLowerCase()) {

答案 1 :(得分:2)

根据您对方法的实际使用情况,使用魔术返回值(#include <stdio.h> char graph[11][11]; void printgraph(){ int i, j; char graph[11][11]; for(j = 0; j<=10; j++){ for(i = 0; i<=10; i++){ putchar(graph[i][j]); } printf("\n"); } } int main(){ char c, graph[11][11]; int i, j, onoroff, numchar[10]; for(i = 10; i>=0; i--) graph[0][i] = i; for(j=10;j>=0; j--) graph[j][0] = j; for(j=0;j<=9;i++) numchar[j] = 0; onoroff = 1; i = 0; while(graph[1][10] != 'O' || graph[2][10] != 'O' || graph[3][10] != 'O' || graph[4][10] != 'O' || graph[5][10] != 'O' || graph[6][10] != 'O' || graph[7][10] != 'O' || graph[8][10] != 'O' || graph[9][10] != 'O' ||graph[10][10] != 'O'){ while((c = getchar()) != EOF){ printgraph(); if(c == ' '|| c == '\n' || c == '\t'){ if(onoroff == 1){ numchar[i]++; graph[i][numchar[i]+1] = 'O'; } onoroff = 0; i = 0; }else if(onoroff == 1){ i++; }else if(onoroff == 0){ onoroff = 1; i++; } } } return 0; } )来指示无效参数可能不是最佳选择。

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

如果调用者只应该调用具有有效月份名称的方法,那么抛出异常会更好,在这种情况下,抛出0是完全有效的。但是你应该记录下来:

NullPointerException

如果您不想要例外,并且您正在使用Java 8,则可能需要使用新的Optional强制调用者检查特殊返回值:

/**
 * 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);
    }
}

答案 2 :(得分:1)

就像在道路旁边有一个防撞栏 - 没有人故意进入它们,因此它们并非绝对必要,但我们把它们放在那里因为当出现意外错误时,它们会帮助控制发生的事情。碰撞障碍阻止汽车远离道路并损坏其他人或建筑物。

换句话说,如果一切正常都没有必要 - 在你的例子中,一切都只能运作良好 - 但是在更大的代码中,许多事情并不顺利。很多人都在努力工作,很多人匆忙使用它,或者很累,或者没有理解它。编写代码好像事情会出错,然后防范它是一个被称为“防御性编程”的想法,并且检查传递给函数的参数实际上是你认为它们应该是什么可以帮助使更可靠,使程序更具弹性整体错误减少,安全漏洞的可能性降低。

这个问题,答案和链接有更多的想法 - Basic defensive programming