2012-06-22 3 views
1

Java의 모범 사례에 대한 질문이 있습니다. 저는 꽤 많이 건설중인 물건에 의존하는 수업을 쓰고 있습니다. 사실, 생성시 전달 된 객체가 null 인 경우 대부분의 기능이 적합하지 않습니다. 객체 생성시 null이 인수로 전달되는 경우 예외를 throw하는 것이 가장 좋다고 생각했지만이 경우 가장 적절한 예외가 무엇인지 알 수 없습니다. NullPointer, IllegalArgument, Instatiation 또는 심지어 초기화 예외를 던져야합니까?NullPointerException과 IllegalArgumentException 중 하나를 선택하여 객체 생성시 신호 오류가 발생합니다.

나는이 모든 것들을 자바 소스 코드베이스에서 사용하는 것을 보았으며 어떤 경우에는 NullPointer가 사용 된 이유와 다른 경우에는 IllegalArgument가 사용 된 이유를 구별 할 수없는 것처럼 보입니다. 나는 개인적으로 건설에서 잘못된 인수가 전달되면 초기화 오류가 발생해야한다고 생각했을 것입니다.

+1

오브젝트에 대해 아무런 작업을하지 않으면 Java가 NPE 자체를 던집니다. – MikeTheLiar

+1

매우 사실이지만, 고객에게 즉시 알려 드리고자합니다. 런타임시 숨기기 전에 오류를 포착합니다. – Sal

답변

4

IllegalArgument 코드를 사용되는 개발자에게, 그것은 명확하게하는 방법 그것을 고치기 위해 나는 말할 것이다. 또한 메서드가 해당 객체 없이는 작동하지 않는다는 것을 분명히합니다.

NullPointer는 문제가 무엇인지에 대해 조금 생각해야한다는 것을 의미하며 코드가 더 깨끗함을 의미 할 수도 있지만 위에서 말한 것처럼 말입니다. 문서의 관점에서 볼 때 코드가 null 값으로 작동하는지 여부는 즉시 명확하지 않습니다.

+2

축하합니다 Disco, 귀하의 답변은 Jon Skeet의 것으로 선택되었습니다. – MikeTheLiar

+0

나는 VM에 NullPointerExceptions를 남기고 결코 명시 적으로 던지지 않는 것을 선호한다. 따라서 매개 변수 검사는 IllegalArgumentException을 던집니다. – Robin

+0

그래, 나는 존 스켓에게 그의 대답을 받아들이지 않음으로써 기분을 상하게하지 않았 으면 좋겠어.하지만 나는 디스코가 포인트를 좀 더 사용할 수있을 거라고 생각했다. – Sal

5

먼저 예외를 throw해야합니다. 그것은 단지 옳은 일입니다.

IllegalArgumentException 또는 NullPointerException을 던져야하는지 여부 - Josh Bloch는 Effective Java에서 이에 대해 이야기하고 일반적으로 NullPointerException이 합리적인 선택이라고 결론을 짓습니다. (나는 아마도 을 뽑았을 것입니다.) 확신 할 수는 없지만, 궁극적으로는 별 문제가되지 않을 것입니다. 이러한 예외 중 하나를 직접 잡아서는 안되며 스택 추적은 문제가있는 곳을 알려줄 것입니다.

(이 수치는 자바 .NET의 ArgumentNullException, 그것은 같은 소리 정확히 무엇을 의미에 동등이 없습니다입니다.) 개인적으로

내가 구아바의 Preconditions 클래스의 큰 팬이에요 :

public class Foo { 
    private final Bar bar; 

    public Foo(Bar bar) { 
    this.bar = Preconditions.checkNotNull(bar); 
    } 
} 

(때로는 checkNotNull의 정적 가져 오기를 사용했습니다.)

+2

+1 : 아무 것도 자신의'ArgumentNullException'을 만들지 않습니다. 클라이언트는 어쨌든 그것을 잡아서는 안됩니다 ... –

1

NullPointerException가 유효한 객체를 기대 할 때 사용하는 대신 null를 얻을 수있다. 특히 null 개체에서 메서드를 호출 할 때 적합합니다. 가장 일반적인 용도입니다. 그러나 귀하의 케이스도 보증 할 수 있습니다.

IllegalArgumentException은 예상하지 못한 방식이나 잘못된 유형/스타일/등의 방법으로 인수를 받았을 때 사용됩니다. 이, 내보기에서, 귀하의 경우에 더 적합 할 것입니다. 유효한 개체를 예상했지만 null을 인수로 받았습니다. 이 인수 값이 잘못되었습니다 - 그래서 나는 IllegalArgumentException 던져 예외의 메시지에 잘못된, 예를 들면 무엇을 지정합니다 : 문제가 무엇인지,

public MyClass(InputObject obj) { 
    if(obj == null) { 
     throw new IllegalArgumentException("null passed to MyClass constructor"); 
    } 

    ... 
} 
1

플랫폼 예외로 인해 클라이언트가 문제를 이해하고 해결할 수있는 적절한 양의 정보를 제공하지 않는다고 생각하는 경우 해당면에서 더 적절한 예외를 직접 작성할 수 있습니다.NET의 ArgumentNullException; 어떤 클라이언트가 무엇이 문제입니까 문제를 해결할 것입니다.

관련 문제