2013-12-21 125 views
1

我应该怎么做,如果有接收空或意外值的方法:抛出异常或对待异常?

  • 值转换为正常值(款待除外) 或
  • 抛出一个异常,因为值是无效的?
+1

_ “在你看来” _。这只是为了获得接近的选票。也许重新格式化这个问题。它看起来并不像是一个有见识的问题。 –

+1

如果你不得不问,你应该抛出异常。不得不提问意味着你不知道在你的方法背景下做的正确事情。 –

回答

1

这取决于你的用例。

如果您希望API的用户处理无效,因为您的API没有指定应如何处理无效性,请抛出异常。

你也可以检查null,然后抛出一个IllegalArgumentException异常,并给出解释为什么不允许null的消息,或者可能的值。但是,如果要在实现中处理空值,则必须清楚地说明该方法如何处理空条件。

例如,看看StringUtilsEnumUtils如何在Apache commons-lang中处理无效。

异常处理的另一个有趣的阅读是here

可能的使用情况:

检查空,默认为缺省值:这应该在方法的规范进行记录。

if(value == null) { 
    value = DEFAULT_VALUE; 
} 

这是首选当API需要征收默认行为。缺点是,缺省行为不容易被API的用户改变。

检查空和投掷检查异常主要是为了迫使API的用户来处理无效的情况:

if(value == null) { 
    throw new MyCheckedException("Value cannot be null"); 
} 

API的用户需要办理或者重新掷它:

try { 
    MyObject value = doWork(); 
} catch (MyCheckedException e) { 
    handleException(e); 
} 

此方法允许API的用户更好地控制异常处理。

以上两种方法都是安全的。

但是,如果您希望系统在遇到空值时仅在运行时发生故障,并且不强制API的用户处理该异常,则可能会用运行时异常包装它。

检查空和投掷运行时异常:

if(value == null) 
    throw new MyRuntimeException("Value is null"); 

在任何情况下,你会留下空条件选中。

2

这非常依赖于您的上下文。我只能评论说JDK API经常选择抛出异常,这会在方法调用之前强制添加样板检查。特别会伤害的是方法的可组合性,其中您希望null值能够无缝地通过链接调用传播,并且只能在最后被检测到,而不是在每个特定步骤进行艰苦检查,这需要大量的开销局部变量保持中间结果的方式,if-branching等等。

因此,以上述为准则来指导您的选择。

1

如果只有开发者的情况应该知道它的一个bug。

assert value != null; 

如果它的情况值不必为空。

if (value == null) throw new NullPointerException(); 

如果它的情况值真不应该为空。

if (value == null) LOGGER.error("Null value!", new NullPointerException()); 

如果它的情况值可能不应该为空。

if (value == null) LOGGER.warn("Null value."); 

如果它的情况值非常空。

if (value == null) LOGGER.info('Value is null.'); 

任何其他情况:

它的设计问题,你可以从过载到void foo(Object maynull)void foo()方法?也许一个类中的字段通常可以为null,将其重新设计为Object和Wrapper类。

在示例(假设你没有懒惰干将):

public class Car{ 
    Passengers[] p; // Bad idea 
    Passengers[] p=new Passengers[0]; // Good idea 

    List<Passengers> p; // Bad idea 
    List<Passengers> p=new ArrayList<>(); // Good idea 
} 

或所述实施例:

// Bad idea 
public class Tree{ 
    Bird motacillaFlava=null; 
    ... 
} 

// Good idea 
public class Tree{...} 
public class BirdInTree{Tree t; Bird motacillaFlava;} 

问候。

注意:断言只适用于-ea标志