抛出异常或处理异常?

时间:2013-12-21 15:30:51

标签: java methods exception-handling

如果存在接收空值或意外值的方法,我该怎么办:

  • 将值转换为正常值(处理异常) 或
  • 因为值无效而抛出异常?

3 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您的背景。我只能评论JDK API经常选择抛出异常,这会强制在方法调用之前添加样板检查。特别伤害的是方法的可组合性,你希望null值通过链式调用无缝传播,并且最后只能被检测到,而不是每次都经过精心检查。特殊步骤,需要大量的局部变量开销来保持中间结果,if-branching等等。

因此,请将上述内容作为指导您选择的标准。

答案 1 :(得分:1)

这取决于您的使用案例。

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

您也可以检查null,然后抛出IllegalArgumentException,并带有一条消息,解释为什么不允许null,或者可能是什么值。

但是,如果要在实现中处理null值,则必须清楚地记录该方法如何处理null条件。

例如,查看StringUtilsEnumUtilsApache commons-lang处理无效的方式。

关于异常处理的另一个有趣的读物是here

可能的用例:

检查null并默认为默认值:这应记录在方法规范中。

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

当API需要强制执行默认行为时,这是首选。缺点是,API的用户不能轻易改变默认行为。

检查null并抛出Checked Exception主要是为了强制API的用户处理null情况:

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

API的用户需要处理它或重新抛出它:

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

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

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

但是,如果您希望系统仅在遇到空值时在运行时失败并且不强制API的用户处理异常,那么用运行时异常包装它可能是有用的。

检查null并抛出运行时异常:

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

在任何情况下都不会取消选中空状态。

答案 2 :(得分:1)

如果只有开发人员的情况应该知道它的错误。

    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-class。

在示例中(假设您没有延迟getter):

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标志