我使用x!=null以避免NullPointerException。还有其他选择吗?

if (x != null) {
    // ...
}

当前回答

您可以使用FindBugs。他们还有一个Eclipse插件),可以帮助您查找重复的空检查(除其他外),但请记住,有时您应该选择防御性编程。还有Java合同可能会有所帮助。

其他回答

!=的另一种选择空检查是(如果你无法在设计上摆脱它):

Optional.ofNullable(someobject).ifPresent(someobject -> someobject.doCalc());

or

Optional.ofNullable(someobject).ifPresent(SomeClass::doCalc);

SomeClass是某个对象的类型。

但是,您无法从doCalc()获取返回值,因此仅对void方法有用。

您可以考虑空对象是bug的情况,而不是空对象模式(有其用途)。

当抛出异常时,检查堆栈跟踪并解决错误。

我尝试过NullObjectPattern,但对我来说并不总是最好的方法。有时,“不采取行动”并不合适。

NullPointerException是一个运行时异常,这意味着它是开发人员的错,并且凭借足够的经验,它会准确地告诉您错误在哪里。

现在来回答:

尽量将所有属性及其访问器设为私有,或者避免将它们暴露给客户端。当然,您可以在构造函数中设置参数值,但通过缩小范围,您不会让客户端类传递无效值。如果需要修改值,可以始终创建新对象。您只检查构造函数中的值一次,在其他方法中,您几乎可以确定这些值不为空。

当然,经验是理解和应用这一建议的更好方式。

字节

我遵循以下准则以避免空检查。

尽可能避免成员变量的延迟初始化。初始化声明本身中的变量。这将处理NullPointerExceptions。在周期早期决定成员变量的可变性。有效地使用像final关键字这样的语言结构。如果您知道不会更改方法的扩充,请将它们声明为final。尽可能限制数据的变异。某些变量可以在构造函数中创建,并且永远无法更改。删除公共setter方法,除非确实需要它们。例如,假设应用程序中的一个类(A.java)正在维护HashMap这样的集合。不要在A.java中提供公共getter方法,而允许B.java直接在Map中添加元素。而是在A.java中提供一个API,它将一个元素添加到集合中。//避免a.getMap().put(键,值)//推荐的public void addElement(对象键,对象值){//在此处对键和值进行空检查:单个位置map.put(键,值);}最后,在正确的位置有效地使用try{}catch{}finally{}块。

您可以使用类似JUnit的框架将类与单元测试相结合。这样,您的代码将是干净的(没有无用的检查),并且您将确保您的实例不会为空。

这是使用单元测试的一个很好的理由。