2016-11-23 9 views
1

NullPointerException을 발생 시키려면 무엇을 선택해야합니까?try/catch 대 if/else throw NullPointerException

1)

if(parameter != null){ 
    // do something 
} else { 
    Log.error("Reason for Exception."); 
    throw new NullPointerException(); 
} 

2) 2에서

try{ 
    // do something 
} catch (NullPointerException npe) { 
    Log.error("Reson for Exception."); 
    throw npe; 
} 
+1

없음, 나는 IllegalArgumentException을 던질 것이지만 첫 번째 것을 선호한다 – Pau

+1

솔직히 ... 수동으로'NPE'를 실행하고 싶지는 않을 것이다. 만약 메소드가' 거기에 IllegalArgumentException이 있습니다. – SomeJavaGuy

+0

[효과적인 자바 (https://books.google.hr/books?id=ka2VUBqHiWkC&pg=PA248&lpg=PA248&dq=effective+java+standard+exceptions&source=bl&ots=yZJoQmw0M0&sig=8BlDhQjQqy3g41tQCCS2Znuk_T8&hl=en&sa=X&ved=0ahUKEwi1-sqiub7QAhXKIsAKHWNXBaAQ6AEIPzAG#v= onepage & q & f = false)는 NPE에 조언하지만 Kevin과 Pau의 편입니다. –

답변

3

) 당신은 정확하게 NPE를 던진 표현 알 수 없습니다. 1) 예외를 던지는 이유는 분명합니다. 필요한 경우 여러 개의 개별 null 검사를 수행하십시오.

if (arg == null) { 
    throw new IllegalArgumentException("arg is null"); 
} 
... just go on with the method, no else block needed 

을 그리고 당신은 자바 7에 적어도 있다면 :

그러나, 첫 번째 접근 방식은 다시 작성해야

Objects.requireNonNull(arg, "arg is null"); 

두 번째 점 : 일반적인 규칙은 던져 중 하나입니다 예외 또는 오류를 기록하십시오. 동시에 두 가지를 동시에 사용할 수는 없습니다. 이 경우에는 던지기를 선택해야하며 모든 예외가 포착되고 기록되는 전체 작업 단위를 포함하는 하나의 중앙 위치가 있어야합니다.

+0

하지만 반환 값이있는 if/else 메서드를 추가 할 때 무엇을해야합니까?(어떤 특정 객체)이 경우 오류가 발생했는지 확인할 수 있도록 반환 할 내용은 무엇입니까? – SchAlubs

+1

예외를 throw하면 아무 것도 반환하지 않습니다. –

+0

맞아, 나도 알아,하지만 당신은 내가 로깅 할 때 예외를 던져서는 안된다고 말했다. – SchAlubs

-1

매개 변수가 null이 아닌지 확인하려는 경우 Guava's Preconditions (특히 checkNotNull)을 사용하는 것이 좋습니다.

Preconditions.checkNotNull(parameter, "Please specify a value for parameter"); 

매개 변수가 null 인 경우 지정된 메시지와 함께 NPE가 throw됩니다.

1

먼저 IllegalArgumentExceptionNullPointerException 이상으로 사용합니다. 그러나 둘 사이에서 선택하는 경우, 나는 분명하기 때문에 첫 번째 것을 선호합니다.

그렇지 않으면 이와 같은 상투적 인 코드가 내 의견으로는 추악 해지는 것을 피하십시오. 그것을 검사하는 클래스 Assert을 사용할 것입니다. Spring Assert과 같이 자신 만의 Assert 클래스를 사용하거나 완료된 클래스를 사용할 수 있습니다.

당신의 Assert 클래스는이 같은 것입니다 :

Assert.isNotNull(parameter); 
+0

JDK에 있습니다. https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#requireNonNull(T,%20java.lang.String) –

+0

왜 덜 사용합니까? 특정 예외에 대한 특정 예외? – EJP

1

첫 번째 코드 :

public Assert { 

    public static void isNotNull(Object object) { 
      if(null == object) 
       throw new IllegalArgumentException(".. must be not null"); 
    } 

    .... 

} 

그런 다음 당신은 그냥 그렇게 사용합니다 (이 한 줄에 boilperplate 코드를 감소) 이미 값을 테스트하고 if 조건에 실패하면 null 결과를 줄 수 있기 때문에 적절합니다.