如果存在接收空值或意外值的方法,我该怎么办:
答案 0 :(得分:2)
这在很大程度上取决于您的背景。我只能评论JDK API经常选择抛出异常,这会强制在方法调用之前添加样板检查。特别伤害的是方法的可组合性,你希望null
值通过链式调用无缝传播,并且最后只能被检测到,而不是每次都经过精心检查。特殊步骤,需要大量的局部变量开销来保持中间结果,if-branching等等。
因此,请将上述内容作为指导您选择的标准。
答案 1 :(得分:1)
这取决于您的使用案例。
如果您希望API的用户处理无效,因为您的API未指定应如何处理无效,请抛出异常。
您也可以检查null,然后抛出IllegalArgumentException,并带有一条消息,解释为什么不允许null,或者可能是什么值。
但是,如果要在实现中处理null值,则必须清楚地记录该方法如何处理null条件。
例如,查看StringUtils中EnumUtils或Apache commons-lang处理无效的方式。
关于异常处理的另一个有趣的读物是here。
可能的用例:
检查null并默认为默认值:这应记录在方法规范中。
if(value == null) { value = DEFAULT_VALUE; }
当API需要强制执行默认行为时,这是首选。缺点是,API的用户不能轻易改变默认行为。
检查null并抛出Checked Exception主要是为了强制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");
在任何情况下都不会取消选中空状态。
答案 2 :(得分:1)
如果只有开发人员的情况应该知道它的错误。
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-class。
在示例中(假设您没有延迟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
标志