확장 루프의 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
}
다른 방법이 없을 수도 있어요.저들이 저걸 넣었어야 했을까?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)) {
}
하지만 나는 실제로 그렇게 할 것 같지 않다. 나는 보통 너의 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 프로젝트 페이지를 참조하십시오.여기 있습니다nullToEmpty
API 문서 및 소스
포함할 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
'programing' 카테고리의 다른 글
gcc 옵션 -fomit-frame-pointer를 이해하려고 합니다. (0) | 2022.06.27 |
---|---|
memset에 bzero를 사용하는 이유는 무엇입니까? (0) | 2022.06.27 |
정확히 어떻게 이중 문자열 트릭이 작동할까요? (0) | 2022.06.27 |
문자를 Java의 ASCII 숫자 값으로 변환 (0) | 2022.06.27 |
Java: 경로와 파일 (0) | 2022.06.27 |