[java] 향상된 for 루프의 널 체크

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 인 경우 루프를 실행하지 않습니까?



답변

해당 목록을 어디서 구할 수 있는지 더 잘 확인해야합니다.

빈 목록은 실패하지 않기 때문에 빈 목록 만 있으면됩니다.

이 목록을 다른 곳에서 가져 와서 괜찮은지 모르는 경우 유틸리티 메소드를 작성하여 다음과 같이 사용할 수 있습니다.

for( Object o : safe( list ) ) {
   // do whatever 
 }

물론 safe다음과 같습니다.

public static List safe( List other ) {
    return other == null ? Collections.EMPTY_LIST : other;
}


답변

null로 전달하면 빈 시퀀스를 반환하는 도우미 메서드를 작성할 수 있습니다.

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

그런 다음 사용하십시오.

for (Object object : emptyIfNull(someList)) {
}

나는 실제로 그렇게 할 것이라고 생각하지 않습니다. 나는 보통 두 번째 양식을 사용합니다. 특히 “또는 throw ex”는 중요합니다. 실제로 null이 아니어야하는 경우 예외를 반드시 처리해야합니다. 당신은 무언가 잘못 되었다는 것을 알고 있지만, 피해의 정도를 모른다. 일찍 중단하십시오.


답변

이미 2017이며 이제 Apache Commons Collections4를 사용할 수 있습니다.

사용법 :

for(Object obj : ListUtils.emptyIfNull(list1)){
    // Do your stuff
}

로 다른 Collection 클래스에 대해 동일한 null 안전 검사를 수행 할 수 있습니다 CollectionUtils.emptyIfNull.


답변

Java 8 사용 Optional:

for (Object object : Optional.ofNullable(someList).orElse(Collections.emptyList())) {
    // do whatever
}


답변

라이브러리 라이브러리 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 만트라를 위해 주목할 가치가 있다고 생각합니다. 참고 항목 평민 – 랭 프로젝트 페이지를. nullToEmptyAPI 문서소스 는 다음과 같습니다.

commons-lang프로젝트 에 포함 할 Maven 항목 ( 아직없는 경우)

<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;
}


답변

List구현 한 메소드 호출에서 가져 오는 경우을 반환하지 말고 nullempty를 반환하십시오 List.

구현을 변경할 수 없으면 null검사 가 중단됩니다 . 그것이 될 should’t 경우 null는 예외를 throw합니다.

빈 목록을 반환하는 도우미 메서드는 사용하지 않을 수도 있지만 때로는 유용 할 수 있기 때문에 버그를 숨길 수있는 모든 루프에서 호출하는 데 익숙 할 것입니다.


답변

위의 답변을 수정 했으므로 Object에서 캐스트 할 필요가 없습니다.

public static <T> List<T> safeClient( List<T> other ) {
            return other == null ? Collections.EMPTY_LIST : other;
}

그런 다음 간단히

for (MyOwnObject ownObject : safeClient(someList)) {
    // do whatever
}

설명 : MyOwnObject :이 경우 List<Integer>MyOwnObject는 정수가됩니다.