Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建新对象以避免空指针异常是否正确?_Java - Fatal编程技术网

Java 创建新对象以避免空指针异常是否正确?

Java 创建新对象以避免空指针异常是否正确?,java,Java,我不想将null值传递给视图层,因此如果执行以下操作: public List<Object> getListObjFoo(){ List<Object> listObj = datasource.getAll(); return listObj != null ? listObj : new ArrayList<Object>(); } public List getListObjFoo(){ List listObj=dataso

我不想将
null
值传递给视图层,因此如果执行以下操作:

  public List<Object> getListObjFoo(){
    List<Object> listObj = datasource.getAll();
    return listObj != null ? listObj : new ArrayList<Object>();
  }
public List getListObjFoo(){
List listObj=datasource.getAll();
返回listObj!=null?listObj:newArrayList();
}

这应该被认为是一种好的做法还是一种坏的做法?在谷歌的“番石榴”中使用“可选”比这样做更好吗?为什么?

不检查null会使代码更干净,但也有代价(这取决于要创建的对象的复杂性)

返回
Collection.emptyList()
而不是
null
是一种很好的做法,因为它的成本等于零

更新


返回空列表的现有示例甚至可以在方法
Query\getResultList()
中的
JavaPersistenceAPI
中看到。如果没有找到任何查询结果,它总是返回空的结果列表。

Null是直接内存管理语言遗留下来的,指针可以指向任何地方。现代语言和实践鼓励避免使用空值。作为经验法则,尝试在可能的情况下使用非空变量,并考虑使用可选而不是使用nulable。你可以阅读更多关于原因的文章


关于你的案子。我假设问题是“我应该返回什么,空集合,null还是空可选?”。简单的回答是:这取决于您的用例。使用nullable result或Optional清楚地表明,整个结果是可选的。例如,对于web视图,它可以告诉您可以使用列表渲染整个块,也可以不使用列表渲染整个块。另一方面,返回可能为空的不可为null的集合意味着您应该始终呈现相应的块,但在某些情况下,其中可能没有元素。

您的代码是错误的做法,因为它分配了一个新实例。尝试改用
Collection.emptyList()

缺点:如果代码的使用者想要更改列表,他们需要制作列表的副本。但这是一个很好的实践,因为许多框架返回不可变的列表,作为消费者,您永远无法确定,除非API实际说明允许您对结果做什么

返回
null
是不好的,因为这会将代码的实现细节导出给使用者。或者换一种说法:如果更改了实现,突然发现要返回
null
,可能需要在使用API的所有位置添加检查。因此,它妨碍了您改进代码和API的能力

对于其他(非集合)类型,您应该查看如下所述的“可选”模式:


此模式允许您告诉API的使用者,某些方法可能会返回“nothing”,而不会返回
null
。这样,消费者就知道会发生什么。

列表通常是一种不好的做法。现在一个特定的
列表
类型就可以了。最后,根据上下文的不同,我觉得这很好。@最重要的是:空检查总是比不需要的对象好。我强烈反对这种说法。这两个变量肯定都有位置。您可能应该返回
Collections.emptyList()
而不是
new ArrayList()
两个问题:能否
dataSource.getAll()
本身返回一个空的
ArrayList
,如果是这样,区分它和
null
很重要吗?@TheLostMind:如果所有调用方法都是对象o:list
?那么就不需要显式的
isEmpty()
检查此方法是否从不返回
null
。这个答案让我们可以从编写代码的角度来考虑,这些代码可以作为API公开,而不存在任何bug。