Генерация исключения и возврат нулевого значения с помощью оператора switch

Итак, у меня есть функция, которая форматирует дату для принуждения к заданному перечислению 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.


person Greg    schedule 02.04.2010    source источник
comment
Если у вас есть условие, которое никогда не должно происходить, я бы использовал AssertionError.   -  person Peter Lawrey    schedule 02.04.2010
comment
Спасибо. AssertionError имеет гораздо больше смысла, чем IllegalArgumentException.   -  person Greg    schedule 02.04.2010


Ответы (4)


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

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

person Bozho    schedule 02.04.2010
comment
Кроме того, генерация исключения за пределами оператора switch позволит выдать предупреждение компиляции, если вы не охватили все значения перечисления как случаи в переключателе (или если перечисление позже будет расширено). - person ILMTitan; 05.04.2010

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

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

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

person Jack    schedule 02.04.2010

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

person Björn Pollex    schedule 02.04.2010

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

person drahnr    schedule 02.04.2010