null 부울이 true인지 확인하여 예외가 발생 함


169

다음 코드가 있습니다.

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

부울 변수 "bool"을 확인한 결과 왜 예외가 발생합니까? 그것이 사실이 아니라고 "보면"if 문을 지나서 바로 뛰어 넘어서는 안됩니까? if 문을 제거하거나 null이 아닌지 확인하면 예외가 사라집니다.


3
객체 언 박싱에 대한 위의 답변은 모두 정확합니다. 그러나 완전성을 위해 개체 래퍼 "Boolean"대신 기본 "boolean"을 사용하도록 코드를 변경할 수도 있습니다. 또한 기본 요소와 오브젝트의 차이점에 대해 새로 고쳐야합니다.
Marvo

한편 ... if (bool == Boolean.TRUE)은 예외를 생성하지 않고 거짓을 평가합니다. 내가 방금 찾은 경우에 이것이 의도적 인 것인지 확실하지 않습니다.
simon.watts

2
@ 대한 거짓 simon.watts 것 boolnull경우, 또는 Boolean(참조로 명시되지 제조 하였다 Boolean.TRUE). 따라서 권장하지 않습니다. if (Boolean.TRUE.equals(bool))안전한 취급 null가치를 포함하여 예상대로 작동하는 것과 반대로 .
StaxMan

답변:


171

가 있으면 또는 boolean중 하나 일 수 있습니다 . 그러나 당신이 그것을 가질 때 또는 다른 객체 일 수 있습니다 .truefalseBooleanBoolean.TRUEBoolean.FALSEnull

특정 경우, Booleanis nullif문 은 boolean을 생성 하는 암시 적 변환을 트리거 합니다 NullPointerException. 대신 필요할 수 있습니다.

if(bool != null && bool) { ... }

23
기술적으로는 Boolean뿐만 아니라 실제 인스턴스 수에 제한이 없습니다 Boolean.TRUE. 예를 들어 new Boolean(true).
Steve Kuo 2016 년

1
그 이유를 이해하기 위해 투쟁 if (myBoolean)(곳 myBoolean입니다 Boolean컴파일러 오류 또는 적어도 경고를 발생시키지 않습니다). 이것은 확실합니다.
Josh M.

1
@JoshM. Java가 래퍼의 권투Unboxing 을 하기 때문 입니다 : docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Vinicius

3
@Vinicius는 확실하지만 컴파일러는 적어도 컴파일러 경고를 통해이 경우 null을 처리해야합니다.
Josh M.

2
@JoshM. 더 이상 동의 할 수 없습니다 :)
Vinicius

402

여분의 null 검사를 원하지 않는 경우 :

if (Boolean.TRUE.equals(value)) {...}

1
@ AvrDragon : 같습니까? 부울에는 두 개의 값만 있기 때문에 연산자 ==가 작동합니다.
Atul

7
@Atul 네, 여기에 등호가 필요합니다. (new Boolean (true) == new Boolean (true))는 .... false이기 때문에. 이유 : 부울은 클래스 일 뿐이며 Java의 다른 클래스와 같이 여러 인스턴스를 가질 수 있습니다.
AvrDragon 2014

35
네, 부끄러운 일입니다. 생성자는 비공개이어야합니다. 그래서 그것이 트윈 글턴임을 보장합니다.
fortran

15
"twingleton"의 경우 @fortran +1입니다.
Bennett McElwee

1
이 관용구에 Apache BooleanUtils를 사용하는 데는 아무런 의미가 없습니다.
StaxMan

82

Apache BooleanUtils를 사용하십시오 .

(프로젝트에서 최고 성능이 가장 중요한 우선 순위라면 외부 라이브러리를 포함하지 않아도되는 기본 솔루션에 대한 다른 답변 중 하나를 살펴보십시오.)

바퀴를 재발 명하지 마십시오. 이미 구축 된 것을 활용하고 다음을 사용하십시오 isTrue().

BooleanUtils.isTrue( bool );

반환하여 Boolean처리 하여 값이 true 인지 확인합니다 .nullfalse

당신은 당신이있는 거 "수"를 포함하는 라이브러리로 제한하지 않는 경우를 포함하여 사용 사례의 모든 종류에 대한 좋은 도우미 기능의 무리가 BooleansStrings. 다양한 Apache 라이브러리를 숙독하고 이미 제공되는 것을 살펴보십시오.


59
대안이 이것과 같은 것을 위해 외부 라이브러리를 사용할 때 바퀴를 재창조하는 것이 그렇게 나쁘지 않은 것처럼 보입니다.
Paul Manta

3
이것은 당신이하려는 유일한 경우 @PaulManta 동의 이제까지 아파치의 Utils 라이브러리에 사용하지만, 제안 된 아이디어는 라이브러리 "정독"기타 유용한 기능에 자신을 노출하는 것입니다.
Joshua Pinter

1
이 라이브러리를 사용하면 성능이 저하됩니다. 따라서 언어의 일부인 기본 사항의 경우 라이브러리를 사용하지 않아야합니다.
ACV

6
도서관은 바퀴를 재발 명하고 있습니다. 나는 그러한 라이브러리를 가능한 많이 피하려고 노력합니다.
mschonaker

3
@mschonaker Apache BooleanUtils가 바퀴를 재창조하는 경우 원래 바퀴는 무엇입니까? 아이디어는 이와 같은 라이브러리에서 이미 수행 된 것을 모방하는 많은 도우미 함수를 만드는 것을 피하는 것입니다. 또한 toStringYesNo모든 라이브러리에서이 라이브러리를 사용 합니다.
Joshua Pinter

13

Boolean유형은입니다 null. 당신은 할 필요가 null당신이 그것을 설정으로 확인 null.

if (bool != null && bool)
{
  //DoSomething
}                   

3
이 답변에 어떤 문제가 있습니까? 예외를 던지는 것은 부울을 확인하는 것이 아닙니다. 불필요한 다운 보트.
dodexahedron 2016 년

2
나는 그것이 완전히 합리적인 대답이라는 데 동의합니다. 그래도 예외 처리를 제거 할 수 있습니다.
Marvo

14
예외 전달은 불필요하며, 초보자에게는 나쁜 예가되는 방식으로 진행됩니다. 이것은 공감대 IMO를받을 자격이 있습니다. (예 ... 나는 예제 코드에서 나온다는 것을 알고 있지만 답변에서 반복하면 그것을 승인하는 것으로 보입니다.)
Stephen C

1
그렇다면 올바른 방법은 무엇입니까? 여기에 귀하의 답변이 보이지 않습니다.
Marvo

5
올바른 방법은 위의 방법입니다. 예외 처리가 없습니다. 또한 예외 처리는 너무 일반적이며 사용하지 않는 것이 좋습니다.
vellvisher 2018 년

8

또는 Java 8 Optional의 힘으로 다음과 같은 트릭을 수행 할 수도 있습니다.

Optional.ofNullable(boolValue).orElse(false)

:)


5

부울은 기본 부울의 객체 래퍼 클래스입니다. 이 클래스는 다른 클래스와 마찬가지로 실제로 null 일 수 있습니다. 성능 및 메모리상의 이유로 항상 기본 요소를 사용하는 것이 가장 좋습니다.

Java API의 랩퍼 클래스는 두 가지 주요 목적을 제공합니다.

  1. 콜렉션에 추가되거나 오브젝트 리턴 값이있는 메소드에서 리턴되는 것과 같이 프리미티브가 오브젝트에 예약 된 활동에 포함될 수 있도록 오브젝트의 프리미티브 값을 "랩핑"하는 메커니즘을 제공합니다.
  2. 프리미티브에 대한 다양한 유틸리티 기능을 제공합니다. 이러한 함수의 대부분은 다양한 변환과 관련되어 있습니다. 기본 요소를 String 오브젝트로 변환하거나 원시, String 오브젝트를 2 진, 8 진 및 16 진수와 같은 다른 기수 (또는 기수)로 변환합니다.

http://en.wikipedia.org/wiki/Primitive_wrapper_class


0

변수 bool이 null을 가리키면 항상 NullPointerException이 발생하며 먼저 null이 아닌 값으로 변수를 초기화 한 다음 수정해야합니다.


1
그것이 catch그랬다면 , 블록은 NullPointerException을 처리 할 것입니다. 여기서 문제는 OP가 null 참조를 기본 형식으로 개봉하려고 시도한다는 것입니다.
Mike Adler 2016 년

"항상 항상" -샘플을 제외하고 변수 초기화 null와 테스트 사이에 아무 것도하지 않는 간단한 코드를 제외하고 항상 그렇지는 않습니다 . 아마도 실제 코드는 그렇게 간단하지 않거나 전체 if테스트가 제거 될 수 있습니다.
nnnnnn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.