我有点困惑,只能在方法简单返回或引发异常之间进行选择。 例如,我有一个方法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。什么时候真正从代码返回或引发异常?
答案 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)
它基于您的项目要求。如果您只是返回而没有引发任何异常,那么用户将无法确定为什么不执行该功能,并且从用户的角度来看会造成混乱。
如果您显示警报或消息这些异常,则对于这种情况应该更好。否则,您应该正确地遵循输入验证。