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

Java 抛出异常还是处理异常?,java,methods,exception-handling,Java,Methods,Exception Handling,如果有一个方法接收空值或意外值,我该怎么办: 将值转换为正常值处理异常 或 是否因为值无效而引发异常? 这在很大程度上取决于您的上下文。我只能说JDKAPI经常选择抛出异常,这迫使在方法调用之前添加样板检查。这尤其会损害方法的可组合性,在这种情况下,您希望空值通过链式调用无缝传播,并且只在最后被检测到,而不是在每个特定步骤进行艰苦的检查,这需要大量的开销,例如局部变量来保存临时结果(如果分支等) 因此,请将以上内容作为指导您选择的标准。这在很大程度上取决于您的背景。我只能说JDKAPI经常选择抛

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

将值转换为正常值处理异常 或 是否因为值无效而引发异常?
这在很大程度上取决于您的上下文。我只能说JDKAPI经常选择抛出异常,这迫使在方法调用之前添加样板检查。这尤其会损害方法的可组合性,在这种情况下,您希望空值通过链式调用无缝传播,并且只在最后被检测到,而不是在每个特定步骤进行艰苦的检查,这需要大量的开销,例如局部变量来保存临时结果(如果分支等)


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

这在很大程度上取决于您的背景。我只能说JDKAPI经常选择抛出异常,这迫使在方法调用之前添加样板检查。这尤其会损害方法的可组合性,在这种情况下,您希望空值通过链式调用无缝传播,并且只在最后被检测到,而不是在每个特定步骤进行艰苦的检查,这需要大量的开销,例如局部变量来保存临时结果(如果分支等)


因此,将以上作为一些标准来指导您的选择。

这取决于您的用例

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

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

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

例如,看看如何或如何处理空值

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

可能的用例:

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

当API需要强制默认行为时,这是首选的。缺点是,API的用户无法轻松更改默认行为

检查null并引发选中的异常主要是为了强制API用户处理null情况:

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

try {
    MyObject value = doWork();
} catch (MyCheckedException e) {
    handleException(e);
}
此方法允许API用户对异常处理有更大的控制

以上两种方法都是安全的

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

正在检查null并引发运行时异常:


在任何情况下,都不能取消选中空条件。

这取决于您的用例

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

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

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

例如,看看如何或如何处理空值

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

可能的用例:

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

当API需要强制默认行为时,这是首选的。缺点是,API的用户无法轻松更改默认行为

检查null并引发选中的异常主要是为了强制API用户处理null情况:

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

try {
    MyObject value = doWork();
} catch (MyCheckedException e) {
    handleException(e);
}
此方法允许API用户对异常处理有更大的控制

以上两种方法都是安全的

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

正在检查null并引发运行时异常:


在任何情况下,您都不会让空条件处于未选中状态。

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

    assert value != null; 
如果是这种情况,则值永远不必为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.");
如果出现这种情况,则值可能不应为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对象到void foo对象的hod可能为空?也许类中的一个字段经常可以为null,将其重新设计为一个对象和一个包装器类

在示例中,假设您没有惰性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
}
问候


注意:如果只有开发人员知道它是一个bug,那么Assert只能与-ea标志一起工作

    assert value != null; 
如果是这种情况,则值永远不必为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.");
如果出现这种情况,则值可能不应为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 fooObject maynull的方法重载到void foo吗?也许类中的一个字段经常可以为null,将其重新设计为一个对象和一个包装器类

在示例中,假设您没有惰性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
}
问候


注意:在您看来,Assert仅与-ea标志一起工作。那只不过是要求接近票数。也许重新设计问题的格式,不考虑这一点。这看起来不一定是一个固执己见的问题。如果你不得不问,你应该抛出异常。在你看来,不得不提问意味着你不知道在你的方法中应该做什么。那只不过是要求接近票数。也许重新设计问题的格式,不考虑这一点。这看起来不一定是一个固执己见的问题。如果你不得不问,你应该抛出异常。不得不问意味着你不知道在你的方法的上下文中应该做什么。