有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java抛出异常还是处理异常?

如果有一个方法接收空值或意外值,我该怎么办:

  • 将值转换为正常值(处理异常) 或者
  • 是否因为值无效而引发异常

共 (3) 个答案

  1. # 1 楼答案

    这在很大程度上取决于你的背景。我只能指出,JDK API经常选择抛出异常,这会迫使在方法调用之前添加样板检查。尤其令人痛心的是方法的可组合性,在这种情况下,你需要一个null值通过链式调用无缝传播,并且只在最后被检测到,而不是在每一个特定的步骤上进行艰苦的检查,如果分支,等等

    因此,把以上这些作为一些标准来指导你的选择

  2. # 2 楼答案

    这取决于你的用例

    如果希望API的用户处理空值,因为API没有指定如何处理空值,请抛出异常

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

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

    例如,看看StringUtilsEnumUtilsin Apache commons-lang如何处理空值

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

    可能的用例:

    检查null和默认值:这应该记录在方法规范中

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

    当API需要强制默认行为时,这是首选。缺点是,默认行为不容易被API的用户更改

    检查null并抛出Checked异常主要是为了迫使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");
    

    在任何情况下,都不能不检查null条件

  3. # 3 楼答案

    如果只有开发人员知道这是一个bug

        assert value != null; 
    

    如果出现这种情况,则值永远不必为空

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

    如果出现这种情况,则值realy不应为null

        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()吗?也许类中的一个字段经常可以为空,将其重新设计为一个对象和一个包装器类

    在示例中(假设您没有懒惰的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标志一起使用