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;}
# 1 楼答案
这在很大程度上取决于你的背景。我只能指出,JDK API经常选择抛出异常,这会迫使在方法调用之前添加样板检查。尤其令人痛心的是方法的可组合性,在这种情况下,你需要一个
null
值通过链式调用无缝传播,并且只在最后被检测到,而不是在每一个特定的步骤上进行艰苦的检查,如果分支,等等因此,把以上这些作为一些标准来指导你的选择
# 2 楼答案
这取决于你的用例
如果希望API的用户处理空值,因为API没有指定如何处理空值,请抛出异常
您也可以检查null,然后抛出一个IllegalArgumentException,并显示一条消息,解释为什么不允许null,或者可能的值是什么
但是,如果要在实现中处理null值,则必须清楚地记录该方法如何处理null条件
例如,看看StringUtils或EnumUtilsin Apache commons-lang如何处理空值
另一个关于异常处理的有趣读物是here
可能的用例:
检查null和默认值:这应该记录在方法规范中
当API需要强制默认行为时,这是首选。缺点是,默认行为不容易被API的用户更改
检查null并抛出Checked异常主要是为了迫使API用户处理null情况:
API的用户需要处理或重新抛出它:
此方法允许API用户对异常处理进行更大的控制
以上两种方法都是安全的
但是,如果希望系统仅在遇到空值时在运行时失败,并且不强制API用户处理异常,那么使用运行时异常将其包装可能会很有用
检查null并引发运行时异常:
在任何情况下,都不能不检查null条件
# 3 楼答案
如果只有开发人员知道这是一个bug
如果出现这种情况,则值永远不必为空
如果出现这种情况,则值realy不应为null
如果出现这种情况,则值可能不应为空
如果出现这种情况,则值通常为空
任何其他情况:
这是一个设计问题,你能把方法从
void foo(Object maynull)
重载到void foo()
吗?也许类中的一个字段经常可以为空,将其重新设计为一个对象和一个包装器类在示例中(假设您没有懒惰的getter):
或者这个例子:
问候
注意:断言仅与
-ea
标志一起使用