[java] 자바 : 객체가 null인지 확인하는 방법?

웹에서 이미지를 검색하는 응용 프로그램을 만들고 있습니다. 이미지를 검색 할 수없는 경우 다른 로컬 이미지를 사용해야합니다.

다음 줄을 실행하는 동안 :

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
  drawable = getRandomDrawable();
}

drawable이 null 인 경우 if (drawable.equals (null)) 줄에서 예외가 발생합니다.

null 인 경우 예외를 throw하지 않고 로컬 이미지를 검색하기 위해 drawable의 값을 어떻게 확인해야하는지 아는 사람이 있습니까 (execute drawable = getRandomDrawable ())?



답변

편집 된 Java 8 솔루션 :

final Drawable drawable =
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

drawable final이 경우 선언 할 수 있습니다 .

Chasmo가 지적했듯이 Android는 현재 Java 8을 지원하지 않습니다. 따라서이 솔루션은 다른 상황에서만 가능합니다.


답변

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
    drawable = getRandomDrawable();
}

equals()메서드는 값이 같은지 확인 합니다. 즉, 두 개체 의 내용 을 비교 합니다. null이 객체가 아니기 때문에 객체의 내용을의 내용과 비교하려고 할 때 충돌이 발생합니다 null.

==위한 연산자를 검사 기준 은 두 개체가 실제로 있는지 보이는 것을 의미 평등 매우 동일한 개체 . 이것은 개체가 실제로 존재할 필요는 없습니다. 존재하지 않는 두 개체 ( null참조)도 동일합니다.


답변

이 접근 방식을 사용합니다.

if (null == drawable) {
  //do stuff
} else {
  //other things
}

이렇게하면 줄의 가독성이 향상됩니다. 소스 파일을 빠르게 읽을 때 null 검사임을 알 수 있습니다.

다음과 .equals()같은 객체를 호출 할 수없는 이유에 관해서는 null; 가지고있는 객체 참조 (즉 ‘drawable’) 실제로 null이면 힙의 객체를 가리 키지 않습니다. 이는 호출이 equals()성공할 수 있는 힙에 개체가 없음을 의미합니다 .

행운을 빌어 요!


답변

DIY

private boolean isNull(Object obj) {
    return obj == null;
}

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}


답변

drawable.equals(null)

위의 줄은 드로어 블 객체에서 “equals (…)”메서드를 호출합니다.

따라서 드로어 블이 null이 아니고 실제 객체 인 경우 “equals (null)”메서드를 호출하면 “false”가 반환됩니다.

그러나 “drawable”이 null이면 null 객체에 대해 “equals (…)”메서드를 호출하는 것을 의미하고, 존재하지 않는 객체에 대해 메서드를 호출하는 것을 의미하므로 “NullPointerException”이 발생합니다.

객체가 존재하고 null이 아닌지 확인하려면 다음을 사용하십시오.

if(drawable == null) {
    ...
    ...
}

위의 조건에서 참조 변수 “drawable”이 null인지 또는 일부 값 (객체에 대한 참조)이 포함되어 있는지 확인하므로 확인시 drawable이 null 인 경우 예외가 발생하지 않습니다.

null == null

유효합니다.


답변

if (yourObject instanceof yourClassName)로 평가합니다 false경우 yourObject입니다 null.


답변

NullPointerException을 잡는 것이 약간 더 효율적일 것입니다. 위의 메소드는 런타임이 널 포인터를 두 번 확인 함을 의미합니다.