Programing

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

lottogame 2020. 10. 31. 09:12
반응형

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


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

다음 줄을 실행하는 동안 :

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

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

누구든지 드로어 블의 값이 null 인 경우 예외를 throw하지 않고 로컬 이미지를 검색 (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을 잡는 것이 아마도 약간 더 효율적일 것입니다. 위의 메소드는 런타임이 널 포인터를 두 번 확인 함을 의미합니다.


Google Guava libs사용 하여 is-null-check 처리 (데몬의 업데이트)

Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());

Oracle Java 소스 개발자에게 몇 가지 아이디어를 제공하기 위해 :-)

이 솔루션은 이미 .Net에 존재하며 더 읽기 쉽습니다!

Visual Basic .Net에서

Drawable drawable 
    = If(Common.getDrawableFromUrl(this, product.getMapPath())
        ,getRandomDrawable()
        )

C #에서

Drawable drawable 
    = Common.getDrawableFromUrl(this, product.getMapPath() 
        ?? getRandomDrawable();

These solutions are powerful as Optional Java solution (default string is only evaluated if original value is null) without using lambda expression, just in adding a new operator.

Just to see quickly the difference with Java solution, I have added the 2 Java solutions

Using Optional in Java

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

Using { } in Java

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

Personally, I like VB.Net but I prefer ?? C# or if {} solution in Java ... and you ?

참고URL : https://stackoverflow.com/questions/2033088/java-how-to-check-if-object-is-null

반응형