抛出异常与使用switch语句返回null值

时间:2010-04-02 16:55:15

标签: java return-value

所以我有函数格式化日期以强制给定枚举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");    
        }

OR返回null

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 个答案:

答案 0 :(得分:22)

抛出异常,因为这是一个例外情况。

将它扔到switch之外,它会更具可读性。否则听起来像“默认情况特殊”。

答案 1 :(得分:13)

我认为throw new IllegalArgumentException("Something strange happend")是最好的实践。

使用null只会在您使用返回值的某个地方导致NullPointerException,但它会比提出描述问题的特定异常信息量少! / p>

而且你知道:明确的错误=更好的发展。

答案 2 :(得分:1)

我会采用第一种方法(但在第二种方法中使用IllegalArgumentException)。您应该包含一个默认语句,以防止有人修改(扩展)您的枚举时的情况。将异常放在default-statement中会使读者清楚地知道代码永远不会超过switch语句。否则,他们必须检查是否真的所有枚举值都在交换机中。

答案 3 :(得分:1)

异常,因为你可以比单个return int更多地服从父级。通常使用存在的异常(C ++),并返回不在(C)的值。