programing

확장 루프의 null 검사

prostudy 2022. 6. 27. 21:06
반응형

확장 루프의 null 검사

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
}

다른 방법이 없을 수도 있어요.저들이 저걸 넣었어야 했을까?fornull일 경우 루프를 실행하지 않는가?

당신은 그 목록을 어디서 얻었는지 확인하는 게 좋을 거예요.

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

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

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)) {
}

하지만 나는 실제로 그렇게 할 것 같지 않다. 나는 보통 너의 2번 양식을 이용하겠다.특히, "혹은 던지기 전"은 중요하다 - 만약 그것이 정말로 무효가 되어서는 안 된다면, 당신은 분명히 예외를 두어야 한다.뭔가 잘못됐다는 건 알지만 피해 정도는 모르잖아요.조기 중단.

벌써 2017년이 되었으니 Apache Commons Collections 4를 이용하실 수 있습니다.

사용방법:

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

다른 컬렉션 클래스에 대해서도 같은 null-safe 체크를 수행할 수 있습니다.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의 만트라로서는 주목할 가치가 있다고 생각합니다.commons-lang 프로젝트 페이지를 참조하십시오.여기 있습니다nullToEmptyAPI 문서소스

포함할 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;
}

만약 당신이 그것을 받는다면List실행한 메서드 호출로부터 수신한 후 반환하지 마십시오.null, 빈칸을 반환한다.List.

실장을 변경할 수 없는 경우, 그 결과,null체크하지 말아야 한다면null, 그 후 예외를 발생시킵니다.

빈 목록을 반환하는 도우미 메서드는 사용하지 않습니다.그렇게 하면 버그를 숨길 수 있는 루프마다 호출할 수 있기 때문입니다.

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

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

다음으로 리스트로 전화를 걸기만 하면 됩니다.

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

MyOwnObject: ifList<Integer>MyOwnObject 정수이다.

이 없는 s null을 사용할 수 있습니다.commons-lang'sorg.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object) . : :

    for (final String item : 
    (List<String>)ObjectUtils.defaultIfNull(items, Collections.emptyList())) { ... }

ObjectUtils.defaultIfNull JavaDoc

For 루프에서 null을 효과적으로 방어하는 또 다른 방법은 Google Guava로 컬렉션을 포장하는 것입니다.이것은 클라이언트가 컬렉션이 존재하는지 확인할 것으로 기대되기 때문에 효과적으로 비어있는 컬렉션의 가능성을 명확하게 할 수 있기를 희망합니다.Optional.isPresent().

사용법,CollectionUtils.isEmpty(Collection coll)늘세이프체크

이이 this에 대해서import org.apache.commons.collections.CollectionUtils.

메이븐 의존성

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.0</version>
</dependency>
for (Object object : someList) {

   // do whatever
}  throws the null pointer exception.

언급URL : https://stackoverflow.com/questions/2250031/null-check-in-an-enhanced-for-loop

반응형