在Java中的for循环中防止null的最佳方法是什么?
这看起来很难看:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
或者
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
可能没有其他办法。他们应该把它放在for
构造本身,如果它是null,那么不要运行循环吗?
答案 0 :(得分:213)
您应该更好地验证从哪里获得该列表。
您只需要一个空列表,因为空列表不会失败。
如果从其他地方获得此列表并且不知道它是否正常,您可以创建一个实用程序方法并像这样使用它:
for( Object o : safe( list ) ) {
// do whatever
}
当然safe
将是:
public static List safe( List other ) {
return other == null ? Collections.EMPTY_LIST : other;
}
答案 1 :(得分:93)
如果传入null:
,您可能会编写一个返回空序列的辅助方法public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
return iterable == null ? Collections.<T>emptyList() : iterable;
}
然后使用:
for (Object object : emptyIfNull(someList)) {
}
我不认为我实际上是这样做的 - 我通常会使用你的第二种形式。特别是,“或者抛出ex”很重要 - 如果它真的不应该为null,那么你肯定应该抛出异常。你知道某些东西出错了,但是你不知道损坏的程度。早点中止。
答案 2 :(得分:25)
已经是2017年,您现在可以使用Apache Commons Collections4
用法:
for(Object obj : ListUtils.emptyIfNull(list1)){
// Do your stuff
}
您可以使用CollectionUtils.emptyIfNull
对其他Collection类执行相同的空值安全检查。
答案 3 :(得分:7)
如果您从实施的方法调用中获取List
,则不要返回null
,请返回空List
。
如果您无法更改实施,那么您将坚持使用null
检查。如果它不应该是null
,那么抛出异常。
我不会去找一个返回空列表的辅助方法,因为它可能有用一段时间,但是你会习惯在你可能隐藏一些错误的每个循环中调用它。
答案 4 :(得分:7)
使用ArrayUtils.nullToEmpty
库中的commons-lang
进行数组
for( Object o : ArrayUtils.nullToEmpty(list) ) {
// do whatever
}
此功能存在于commons-lang
库中,该库包含在大多数Java项目中。
// ArrayUtils.nullToEmpty source code
public static Object[] nullToEmpty(final Object[] array) {
if (isEmpty(array)) {
return EMPTY_OBJECT_ARRAY;
}
return array;
}
// ArrayUtils.isEmpty source code
public static boolean isEmpty(final Object[] array) {
return array == null || array.length == 0;
}
这与@OscarRyz给出的答案相同,但为了DRY口头禅,我相信值得注意。请参阅commons-lang项目页面。以下是nullToEmpty
API documentation和source
Maven条目在您的项目中包含commons-lang
(如果尚未包含)。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
不幸的是,commons-lang
不为List
类型提供此功能。在这种情况下,您必须使用前面提到的辅助方法。
public static <E> List<E> nullToEmpty(List<E> list)
{
if(list == null || list.isEmpty())
{
return Collections.emptyList();
}
return list;
}
答案 5 :(得分:7)
使用Java 8 Optional
:
for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
// do whatever
}
答案 6 :(得分:4)
我修改了上面的答案,因此您不需要从Object
进行强制转换public static <T> List<T> safeClient( List<T> other ) {
return other == null ? Collections.EMPTY_LIST : other;
}
然后只需通过
调用Listfor (MyOwnObject ownObject : safeClient(someList)) {
// do whatever
}
阐释:
MyOwnObject:如果是List<Integer>
,那么在这种情况下MyOwnObject将是Integer。
答案 7 :(得分:1)
有效防止for循环中的null的另一种方法是用Google Guava的Optional<T>
包装你的集合,因为这样做,人们希望,有效空集合的可能性是明确的,因为客户端会被期望检查该集合是否与Optional.isPresent()
一起出现。
答案 8 :(得分:1)
对于那些对编写自己的静态空安全方法不感兴趣的人,您可以使用:commons-lang&#39; s org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
。例如:
for (final String item :
(List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }
答案 9 :(得分:0)
使用,CollectionUtils.isEmpty(Collection coll)
方法,如果指定的集合为空,则为Null-safe检查。
这个import org.apache.commons.collections.CollectionUtils
。
Maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
答案 10 :(得分:0)
“||”或者 ”??”在这里派上用场
最佳选择和 IE 兼容是 ||
function counter(value, limit) {
if(value === limit) {
console.log(value);
} else {
console.log(value); // on the way down / going deeper (increment)
counter(value+1, limit);
console.log(value); // on the way up / coming up from the depths (decrement)
}
}
counter(0,10);
// 0, 1, 2, 3 ... 10, 9, 8... 0
Nullish coalescing operator:不兼容 IE
for (Object object : someList || []) {
// undefined and null gets defaulted to an empty array []
}
答案 11 :(得分:-3)
for (Object object : someList) {
// do whatever
} throws the null pointer exception.