简单地返回比抛出异常好吗

时间:2018-12-06 05:05:24

标签: java

我有点困惑,只能在方法简单返回或引发异常之间进行选择。 例如,我有一个方法m1,它以Plan作为参数:

public void m1(final Plan plan){
      if(plan==null){
       log.trace("received null plan.");
       return;
     }
}

OR

public void m1(final Plan plan){
   if(plan==null){
      throw new IllegalArgumentException("received null plan."); 
   }
}

Q1。这里哪个更好? Q2。什么时候真正从代码返回或引发异常?

2 个答案:

答案 0 :(得分:4)

取决于您的情况

这里没有“更好”的地方。哪个合适,取决于业务问题的上下文和您的API的设计。

本质问题是NULL至少具有两个非常不同的含义:

  • 错失价值。
  • 故意省略值。

您必须在自己的特定情况下确定可容忍的条件。

在某些API中,可能有一个方法包含三个参数。根据前两个参数的值,第三个参数可能无关紧要。期望为NULL是适当的。有人会说这是一个笨拙的设计,但这是一个不同的问题。只要可以接受NULL,在这种情况下可能是合理的。

Objects

Java中的Objects类有static methods可以在这里提供帮助。

检查是否为空

检查对象引用是否为null的便捷方法。

public void doIt( Plan plan ) {
    if( Objects.isNull( plan ) ) { … }   // If `plan` is null.
    …
}

...或者为空。

public void doIt( Plan plan ) {
    if( Objects.nonNull( plan ) ) { … }  // If `plan` is not null.
    …
}

投掷NullPointerException

如果您想要的话,一种便捷方法将代表您引发异常。

public void doIt( Plan plan ) {
    Plan p = Objects.requireNotNull( plan ) ;  // Throws a `NullPointerException`.
    …
}

(可选)编写一条消息。

public void doIt( Plan plan ) {
    Plan p = Objects.requireNotNull( plan , "A Plan must be passed, null is not acceptable. Message # b8ad169f-dab6-414f-8728-c50a13a48dbb." ) ;  // Throws a `NullPointerException`.
    …
}

恢复默认设置

有时,当接收到NULL时,方法可以退回到默认值。想象一下,您的Plan类提供了一个名为static final的{​​{1}}常量对象。

BASIC_PLAN

或者您可能想动态定位后备值,以在遇到NULL时将其用作默认值。您传递一个方法引用或一个lambda函数,它们在执行时将返回默认的替代对象。

public void doIt( Plan plan ) {
    Plan p = Objects.requireNonNullElse ( plan , Plan.BASIC_PLAN ) ;  // No exception involved.
    …
}

答案 1 :(得分:-1)

它基于您的项目要求。如果您只是返回而没有引发任何异常,那么用户将无法确定为什么不执行该功能,并且从用户的角度来看会造成混乱。

如果您显示警报或消息这些异常,则对于这种情况应该更好。否则,您应该正确地遵循输入验证。