Выдающая исключительная ситуация против возвращаемого нулевого значения с оператором switch - PullRequest
18 голосов
/ 02 апреля 2010

Итак, у меня есть функция, которая форматирует дату, чтобы привести к данному enum DateType {CURRENT, START, END} что было бы лучшим способом обработки возвращаемого значения в случаях, когда используется оператор switch

public static String format(Date date, DateType datetype) {
    ..validation checks

    switch(datetype){
    case CURRENT:{
        return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss");
    }               
    ... 
     default:throw new ("Something strange happend");
    }

}

ИЛИ бросить исключение в конце

   public static String format(Date date, DateType datetype) {
            ..validation checks

            switch(datetype){
            case CURRENT:{
                return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss");
            }               
            ... 
            }

               //It will never reach here, just to make compiler happy 
        throw new IllegalArgumentException("Something strange happend");    
        }

ИЛИ вернуть ноль

public static String format(Date date, DateType datetype) {
            ..validation checks

            switch(datetype){
            case CURRENT:{
                return getFormattedDate(date, "yyyy-MM-dd hh:mm:ss");
            }               
            ... 
            }

             return null;   
}

Что было бы лучшим опытом здесь? Также все значения перечисления будут обрабатываться в операторе case

Ответы [ 4 ]

22 голосов
/ 02 апреля 2010

Брось исключение, так как это исключительный случай.

И выбросить его за пределы switch, это будет более читабельным. В противном случае это звучит как «случай по умолчанию является исключительным».

13 голосов
/ 02 апреля 2010

Я думаю, что throw new IllegalArgumentException("Something strange happend") - лучшая практика.

Использование null просто предположительно вызовет NullPointerException где-то, когда вы используете возвращаемое значение, но оно будет менее информативным , чем вызов конкретного исключения, описывающего проблему!

И вы знаете: явные ошибки = лучшее развитие.

1 голос
/ 02 апреля 2010

Исключения, так как вы можете подчиняться больше родителю, чем единственный возврат int. Обычно вы используете исключения там, где они существуют (C ++), и возвращаете значения там, где их нет (C).

1 голос
/ 02 апреля 2010

Я бы пошел с первым подходом (но с IllegalArgumentException, как в вашем втором подходе). Вы должны включить заявление по умолчанию для защиты от случаев, когда кто-то изменяет (расширяет) ваше перечисление. Помещение исключения в оператор по умолчанию дает читателю понять, что код никогда не должен проходить через оператор переключения. В противном случае им придется проверить, действительно ли все значения перечисления находятся в переключателе.

...