回答
这取决于你的用例。
如果您希望API的用户处理无效,因为您的API没有指定应如何处理无效性,请抛出异常。
你也可以检查null,然后抛出一个IllegalArgumentException异常,并给出解释为什么不允许null的消息,或者可能的值。但是,如果要在实现中处理空值,则必须清楚地说明该方法如何处理空条件。
例如,看看StringUtils或EnumUtils如何在Apache commons-lang中处理无效。
异常处理的另一个有趣的阅读是here。
可能的使用情况:
检查空,默认为缺省值:这应该在方法的规范进行记录。
if(value == null) { value = DEFAULT_VALUE; }
这是首选当API需要征收默认行为。缺点是,缺省行为不容易被API的用户改变。
检查空和投掷检查异常主要是为了迫使API的用户来处理无效的情况:
if(value == null) { throw new MyCheckedException("Value cannot be null"); }
API的用户需要办理或者重新掷它:
try {
MyObject value = doWork();
} catch (MyCheckedException e) {
handleException(e);
}
此方法允许API的用户更好地控制异常处理。
以上两种方法都是安全的。
但是,如果您希望系统在遇到空值时仅在运行时发生故障,并且不强制API的用户处理该异常,则可能会用运行时异常包装它。
检查空和投掷运行时异常:
if(value == null) throw new MyRuntimeException("Value is null");
在任何情况下,你会留下空条件选中。
这非常依赖于您的上下文。我只能评论说JDK API经常选择抛出异常,这会在方法调用之前强制添加样板检查。特别会伤害的是方法的可组合性,其中您希望null
值能够无缝地通过链接调用传播,并且只能在最后被检测到,而不是在每个特定步骤进行艰苦检查,这需要大量的开销局部变量保持中间结果的方式,if-branching等等。
因此,以上述为准则来指导您的选择。
如果只有开发者的情况应该知道它的一个bug。
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类。
在示例(假设你没有懒惰干将):
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
标志
- 1. 魔术异常抛出抛出异常
- 2. 抛出异常抛出异常
- 3. 异常抛出异常
- 4. 空或抛出异常
- 5. WCF - 抛出异常或FaultException?
- 6. 抛出异常
- 7. 异常抛出
- 8. 抛出异常
- 9. 抛出异常
- 10. 抛出异常
- 11. 抛出异常
- 12. 抛出异常
- 13. 抛出异常
- 14. 抛出或重新抛出异常?
- 15. NamedParameterJdbcTemplate对象抛出异常
- 16. 抛出异常对象
- 17. javascript对象抛出异常
- 18. 对抛出的异常
- 19. 对抛出的异常
- 20. 对象类抛出类抛出异常
- 21. 抛出异常不抛出
- 22. 等待()上的Servlet抛出异常
- 23. RESTClient实现抛出异常异常
- 24. 无效的异常抛出异常
- 25. PDFBox抛出异常:空引用异常
- 26. 在C++中抛出异常异常
- 27. Groovy结束异常抛出异常
- 28. Ognl异常类抛出异常
- 29. 抛出异常并捕获异常?
- 30. LLVM异常抛出
_ “在你看来” _。这只是为了获得接近的选票。也许重新格式化这个问题。它看起来并不像是一个有见识的问题。 –
如果你不得不问,你应该抛出异常。不得不提问意味着你不知道在你的方法背景下做的正确事情。 –