2015-11-26 2 views
0

Может ли кто-нибудь рассказать мне, что является функцией 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); 
    } 
} 
} 
+0

Это проверка на возможность передачи значения «null» методу. Вы можете заменить его на ['Ojbects.requireNonNull'] (https://docs.oracle.com/javase/8/docs/api/java/util/Objects.html#requireNonNull-T-), но это приведет к созданию 'NullPointerException'. В принципе, на основе того, что метод пытается сделать, это потребуется. – MadProgrammer

ответ

3

Необходимо. Если у вас его нет, а месяц прошел, null, то вы получите NullPointerException здесь switch (month.toLowerCase()) {.

+0

Не могли бы вы рассказать мне, по каким обстоятельствам прошел месяц, NULL? ваша помощь с благодарностью – Jess

+2

@ Jess В вашем примере это не так, но нет никакой гарантии, что 'null' никогда не будет передан' getMonthNumber' – MadProgrammer

+0

@Jess - Возьми совет MadProgrammer. Не ходите от его имени: P. Как правило большого пальца всегда предполагают, что вы получите «нуль», а затем код. Это предотвратит неожиданные исключения :) – TheLostMind

1

Это похоже на наличие аварийного барьера рядом с дорогой - никто не влезает в них специально, поэтому они не являются абсолютно необходимыми, но мы помещаем их туда, потому что, когда что-то неожиданно происходит неправильно, они помогают контролировать то, что происходит. Аварийные барьеры останавливают автомобили, идущие далеко от дороги и наносящие ущерб другим людям или зданиям.

Другими словами, это не нужно, если все идет правильно - и в вашем примере все может работать только хорошо, но в более крупном коде многие вещи идут не так хорошо. Многие люди работают над этим, многие люди используют его в спешке или устали или не понимают этого. Написание кода, как будто все пойдет не так, а затем защита от него - это идея, известная как «Оборонительное программирование», и проверка того, что параметры, передаваемые в функции, фактически являются тем, что, по вашему мнению, они должны быть, могут помочь сделать более надежными, сделать программы более устойчивыми с меньше ошибок и с меньшими шансами на дыры в безопасности.

Этот вопрос, ответы и ссылки имеют больше представления о нем - Basic defensive programming

+0

Благодарим вас за подробное объяснение !! – Jess

2

В зависимости от фактического использования метода, с помощью волшебного возвращаемого значения (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, вы можете использовать новый Optional, чтобы заставить абонентов, чтобы проверить особое значение возврата:

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(); 
} 
+0

Благодарим вас за объяснение! действительно оценил это! – Jess

Смежные вопросы