문제

속성에 대한 간단한 설정 방법이 있고 null 이 특정 속성에는 적합하지 않습니다.나는 항상 이런 상황에서 찢어졌습니다.던져야 하나? IllegalArgumentException, 또는 NullPointerException?javadocs에서는 둘 다 적절한 것 같습니다.이해되는 표준이 있습니까?아니면 이것은 당신이 선호하는 무엇이든 해야 하는 일 중 하나일 뿐이며 둘 다 정말 옳습니까?

도움이 되었습니까?

해결책

그것은 것 같다 IllegalArgumentException 당신이 원하지 않으면 호출됩니다 null 허용되는 값이어야 하며, NullPointerException 당신이하려고하면 던져 질 것입니다 사용 변수로 밝혀지는 것 null.

다른 팁

당신은 사용해야합니다 IllegalArgumentException (IAE), 아님 NullPointerException (NPE) 다음과 같은 이유로:

첫째, NPE JavaDoc NPE가 적절한 경우를 명시적으로 나열합니다.모두 버려졌으니 참고하세요 런타임에 따라 언제 null 부적절하게 사용됩니다.대조적으로, IAE JavaDoc 이보다 더 명확할 수는 없습니다."방법이 불법적이거나 부적절한 주장이 통과되었음을 나타 내기 위해 던져졌다." 그래, 그게 너야!

둘째, 스택 추적에서 NPE를 볼 때 무엇을 가정합니까?아마도 누군가가 null.IAE가 표시되면 스택 상단에 있는 메서드 호출자가 잘못된 값을 전달했다고 가정합니다.다시 말하지만, 후자의 가정은 사실이고 전자는 오해의 소지가 있습니다.

셋째, IAE는 매개변수 검증을 위해 명확하게 설계되었으므로 이를 예외의 기본 선택으로 가정해야 하는데 대신 NPE를 선택하는 이유는 무엇입니까?확실히 다른 동작에 대한 것은 아닙니다. 호출 코드가 IAE와 별도로 NPE를 포착하고 결과적으로 다른 작업을 수행할 것으로 기대합니까?좀 더 구체적인 오류 메시지를 전달하려고 하시나요?그러나 다른 모든 잘못된 매개변수에 대해 해야 하는 것처럼 어쨌든 예외 메시지 텍스트에서 이를 수행할 수 있습니다.

넷째, 다른 모든 잘못된 매개변수 데이터는 IAE이므로 일관성을 유지하면 안 될까요?그게 왜 불법이냐 null 너무 특별해서 다른 모든 유형의 불법 주장과 별도의 예외를 둘 자격이 있습니까?

마지막으로 Java API의 일부가 이러한 방식으로 NPE를 사용한다는 다른 답변의 주장을 받아들입니다.그러나 Java API는 예외 유형부터 명명 규칙까지 모든 것과 일치하지 않습니다. 따라서 Java API를 맹목적으로 복사하는 것(가장 좋아하는 부분)은 이러한 다른 고려 사항을 능가할 만큼 충분한 주장이 아니라고 생각합니다.

던지는 것이 기준이다. NullPointerException.일반적으로 오류가 없는 "Effective Java"에서는 항목 42(첫 번째 판), 항목 60(두 번째 판) 또는 항목 72(세 번째 판) "표준 예외 사용 선호"에서 이에 대해 간략하게 설명합니다.

"아마도 모든 잘못된 방법 호출은 불법적 인 논쟁이나 불법 상태로 요약되지만 다른 예외는 특정 종류의 불법적 인 주장과 국가에 대해 표준적으로 사용됩니다.발신자가 NULL 값이 금지되는 일부 매개 변수에서 NULL을 통과하면 컨벤션은 NULLPOINEREXCEPTion이 불법적 인 외상보다는 던져진 것을 지시합니다. "

나는 모두 던지는 것에 찬성했다 IllegalArgumentException null 매개변수의 경우 오늘까지 java.util.Objects.requireNonNull Java 7의 메소드.해당 방법을 사용하는 대신 다음을 수행하십시오.

if (param == null) {
    throw new IllegalArgumentException("param cannot be null.");
}

넌 할 수있어:

Objects.requireNonNull(param);

그리고 그것은 던질 것입니다 NullPointerException 전달한 매개변수가 다음과 같은 경우 null.

그 방법이 중간에 있다는 점을 고려하면 java.util 나는 그 존재를 던지는 것이 매우 강력한 징후라고 생각합니다. NullPointerException "Java의 작업 방식"입니다.

나는 어쨌든 결정했다고 생각한다.

하드 디버깅에 대한 주장은 가짜입니다. 물론 메시지를 제공할 수 있기 때문입니다. NullPointerException null이 무엇이고 왜 null이 되어서는 안 되는지 설명합니다.와 마찬가지로 IllegalArgumentException.

또 하나의 장점이 추가되었습니다 NullPointerException 즉, 성능이 매우 중요한 코드에서는 null에 대한 명시적인 확인을 생략할 수 있습니다(및 NullPointerException 친숙한 오류 메시지와 함께) NullPointerException null 매개변수에 대해 메소드를 호출하면 자동으로 얻을 수 있습니다.메소드를 빠르게 호출하는 경우(예:빠르게 실패), 그러면 본질적으로 동일한 효과를 얻을 수 있지만 개발자에게는 사용자 친화적이지 않습니다.대부분의 경우 명시적으로 확인하고 어떤 매개변수가 null인지 나타내는 유용한 메시지를 표시하는 것이 더 나을 것입니다. 그러나 성능에 따라 메소드/생성자의 게시된 계약을 위반하지 않고 이를 변경할 수 있는 옵션이 있는 것이 좋습니다.

나는 JDK 라이브러리의 디자인, 특히 컬렉션과 동시성(Joshua Bloch, Doug Lea, 견고한 API를 디자인하는 방법을 아는 사람들)의 디자인을 따르는 경향이 있습니다.어쨌든 JDK의 많은 API는 사전에 NullPointerException.

예를 들어, Javadoc Map.containsKey 상태:

@throws nullpointerexception 키가 null 이고이 맵은 null 키를 허용하지 않으면 (선택 사항).

자신의 NPE를 던지는 것은 완벽하게 유효합니다.규칙은 예외 메시지에 null이었던 매개변수 이름을 포함하는 것입니다.

패턴은 다음과 같습니다.

public void someMethod(Object mustNotBeNull) {  
    if (mustNotBeNull == null) {  
        throw new NullPointerException("mustNotBeNull must not be null");  
    }  
}

무엇을 하든 잘못된 값이 설정되도록 허용하지 말고 나중에 다른 코드에서 해당 값을 사용하려고 할 때 예외를 발생시키지 마세요.이는 디버깅을 악몽으로 만듭니다.항상 "빠른 실패" 원칙을 따라야 합니다.

Jason Cohen의 주장이 잘 제시되었기 때문에 이에 투표했습니다.단계별로 분해해 보겠습니다.;-)

  • 그만큼 NPE JavaDoc 분명히 말한다, "널 객체의 다른 불법적인 사용".런타임이 null을 만나면 안 되는 상황으로만 제한했다면 그러한 모든 사례는 훨씬 더 간결하게 정의될 수 있습니다.

  • 잘못된 것을 가정하면 어쩔 수 없지만 캡슐화가 올바르게 적용되었다고 가정하면 null이 부적절하게 역참조되었는지 여부에 대해 신경쓰거나 알아차려서는 안 됩니다.메소드가 부적절한 null을 감지하고 예외를 발생시켰는지 여부.

  • 나는 선택할 것이다 NPE ~ 위에 IAE 여러 가지 이유로

    • 불법 영업의 성격에 대해 좀 더 구체적으로 설명합니다.
    • 실수로 null을 허용하는 논리는 실수로 잘못된 값을 허용하는 논리와 매우 다른 경향이 있습니다.예를 들어, 사용자가 입력한 데이터의 유효성을 검사하는 경우 허용할 수 없는 값이 나오면 해당 오류의 원인은 애플리케이션의 최종 사용자에게 있습니다.null이 발생하면 이는 프로그래머 오류입니다.
    • 잘못된 값으로 인해 스택 오버플로, 메모리 부족 오류, 구문 분석 예외 등이 발생할 수 있습니다.실제로 대부분의 오류는 일반적으로 특정 시점에 일부 메서드 호출에서 잘못된 값으로 나타납니다.이러한 이유로 나는 IAE를 실제로 가장 일반적인 RuntimeException 아래의 모든 예외.
  • 실제로 다른 유효하지 않은 인수로 인해 모든 종류의 다른 예외가 발생할 수 있습니다. 알 수 없는 호스트 예외, FileNotFoundException, 다양한 구문 오류 예외, IndexOutOfBoundsException, 인증 실패 등

일반적으로 NPE는 전통적으로 NPE를 따르지 않는 코드와 연관되어 왔기 때문에 많은 비난을 받고 있다고 생각합니다. 빠른 실패 원칙.게다가 JDK가 NPE를 메시지 문자열로 채우지 못한 것은 사실 근거가 없는 강력한 부정적인 감정을 만들어냈습니다.실제로 런타임 관점에서 NPE와 IAE의 차이점은 엄밀히 말하면 이름입니다.그러한 관점에서 볼 때 이름이 정확할수록 발신자에게 더 명확하게 전달됩니다.

"성전" 스타일의 질문입니다.즉, 두 가지 대안 모두 좋지만 사람들은 죽을 때까지 방어할 선호도를 갖게 됩니다.

만약에 setter 방법과 null 전달되고 있으므로 던지는 것이 더 합리적이라고 생각합니다. IllegalArgumentException.ㅏ NullPointerException 실제로 사용하려고 하는 경우에 더 의미가 있는 것 같습니다. null.

그래서, 만약 당신이 그것을 사용하고 있다면 그것은 null, NullPointer.전달되고 있는 경우 null, IllegalArgument.

Apache Commons Lang에는 NullArgumentException 이는 여기에서 논의된 여러 가지 작업을 수행합니다.이는 IllegalArgumentException을 확장하고 유일한 생성자는 null이 아니어야 하는 인수의 이름을 사용합니다.

NullArgumentException 또는 IllegalArgumentException과 같은 것을 던지는 것이 예외적인 상황을 더 정확하게 설명한다고 생각하지만, 나와 동료들은 이 주제에 대한 Bloch의 조언을 따르기로 결정했습니다.

말한 내용에 더 이상 동의할 수 없습니다.일찍 실패하고 빨리 실패하세요.꽤 좋은 예외 만트라.

어떤 예외를 던질 것인지에 대한 질문은 대부분 개인적인 취향의 문제입니다.내 생각에는 IllegalArgumentException이 NPE를 사용하는 것보다 더 구체적인 것 같습니다. 문제가 메서드를 수행하는 동안 생성되었을 수 있는 값이 아니라 메서드에 전달한 인수에 있다는 것을 알려주기 때문입니다.

내 2센트

다음을 사용하는 경우 허용되는 관행 IllegalArgumentException(문자열 메시지) 매개변수가 유효하지 않다고 선언하고 가능한 한 많은 세부정보를 제공하려면...따라서 예외가 null이 아닌데 매개변수가 null인 것으로 확인되면 다음과 같이 할 수 있습니다.

if( variable == null )
    throw new IllegalArgumentException("The object 'variable' cannot be null");

"NullPointerException"을 암시적으로 사용할 이유가 사실상 없습니다.NullPointerException은 Null 참조에서 코드를 실행하려고 할 때 Java Virtual Machine에서 발생하는 예외입니다. toString()).

실제로 IllegalArgumentException 또는 NullPointerException을 던지는 문제는 내 생각으로는 Java의 예외 처리에 대해 제대로 이해하지 못한 소수를 위한 "성전"일 뿐입니다.일반적으로 규칙은 간단하며 다음과 같습니다.

  • 디버깅하기가 훨씬 어려운 불법 상태를 피하기 위해 인수 제약 조건 위반을 최대한 빨리 표시해야 합니다(-> 빠른 실패).
  • 어떤 이유로든 유효하지 않은 널 포인터가 있는 경우 NullPointerException을 발생시킵니다.
  • 잘못된 배열/컬렉션 인덱스의 경우 ArrayIndexOutOfBounds를 발생시킵니다.
  • 배열/컬렉션 크기가 음수인 경우 NegativeArraySizeException이 발생합니다.
  • 위에서 다루지 않은 잘못된 인수의 경우 더 구체적인 다른 예외 유형이 없는 경우 IllegalArgumentException을 쓰레기통으로 던지십시오.
  • 반면, 일부 타당한 이유로 빠른 실패로 피할 수 없는 필드 내의 제약 조건 위반이 발생하는 경우 IllegalStateException 또는 보다 구체적인 확인 예외를 잡아서 다시 발생시킵니다.이 경우 원래 NullPointerException, ArrayIndexOutOfBounds 등을 전달하지 마십시오!

모든 종류의 인수 제약 조건 위반을 IllegalArgumentException에 매핑하는 경우에 대해 최소한 세 가지 매우 타당한 이유가 있으며, 세 번째는 아마도 나쁜 스타일 관행을 표시할 정도로 심각할 것입니다.

(1) 프로그래머는 인수 제약 조건 위반의 모든 경우가 IllegalArgumentException을 발생시킨다고 안전하게 가정할 수 없습니다. 왜냐하면 대부분의 표준 클래스는 더 이상 특정 종류의 예외가 없는 경우 이 예외를 휴지통으로 사용하기 때문입니다.인수 제약 조건 위반의 모든 사례를 API의 IllegalArgumentException에 매핑하려고 하면 클래스를 사용하는 프로그래머의 좌절만 초래할 뿐입니다. 표준 라이브러리는 대부분 사용자의 규칙을 위반하는 다른 규칙을 따르고 대부분의 API 사용자도 이를 사용하기 때문입니다!

(2) 예외를 매핑하면 실제로 단일 상속으로 인해 다른 종류의 예외가 발생합니다.모든 Java 예외는 클래스이므로 단일 상속만 지원합니다.따라서 하위 클래스는 둘 중 하나만 상속할 수 있으므로 실제로 NullPointerException과 IllegalArgumentException이라는 예외를 생성할 수 있는 방법이 없습니다.따라서 null 인수의 경우 IllegalArgumentException을 발생시키면 API 사용자가 프로그램이 프로그래밍 방식으로 문제를 수정하려고 할 때마다(예를 들어 호출 반복에 기본값을 입력하는 등) 문제를 구별하기가 더 어려워집니다.

(3) 매핑은 실제로 버그 마스킹의 위험을 만듭니다.인수 제약 조건 위반을 IllegalArgumentException에 매핑하려면 제약된 인수가 있는 모든 메서드 내에서 외부 try-catch를 코딩해야 합니다.그러나 단순히 이 catch 블록에서 RuntimeException을 잡는 것은 의문의 여지가 없습니다. 왜냐하면 인수 제약 조건 위반으로 인해 발생하지 않은 경우에도 사용자 내부에서 사용된 libery 메서드에서 발생한 문서화된 RuntimeException을 IllegalArgumentException으로 매핑할 위험이 있기 때문입니다.따라서 매우 구체적이어야 하지만 그러한 노력에도 불구하고 실수로 다른 API의 문서화되지 않은 런타임 예외(예:버그)를 API의 IllegalArgumentException에 추가합니다.따라서 가장 신중한 매핑이라 할지라도 다른 라이브러리 제작자의 프로그래밍 오류를 메소드 사용자의 인수 제약 조건 위반으로 마스킹할 위험이 있습니다. 이는 단순히 터무니없는 행동입니다!

반면에 표준 관행에서는 규칙이 단순하게 유지되고 예외 원인이 드러나지 않고 구체적으로 유지됩니다.메소드 호출자의 경우 규칙도 쉽습니다.- 불법적 인 가치를 통과했기 때문에 문서화 된 런타임 예외, 기본값으로 통화를 반복하거나 (이 특정 예외는 NECCESSARY) 코드를 수정하는 경우 - 반면에 런타임 예외가 발생하면 주어진 인수 세트에 대해서는 문서화되지 않으며, 코드 또는 문서가 수정되도록 메소드 제조업체에 버그 보고서를 제출하십시오.

일반적으로 개발자는 다음과 같이 해야 합니다. 절대 NullPointerException을 발생시킵니다.이 예외는 코드가 값이 null인 변수를 역참조하려고 할 때 런타임에서 발생합니다.따라서 메서드에서 null 값이 NullPointerException을 발생시키는 것이 아니라 명시적으로 null을 허용하지 않으려면 IllegalArgumentException을 발생시켜야 합니다.

다음에만 해당하는 예외 던지기 null 인수(어떠한지 NullPointerException 또는 사용자 정의 유형)이 자동화됩니다. null 더 안정적인 테스트.이 자동화된 테스트는 다음과 같이 리플렉션과 기본값 집합을 사용하여 수행할 수 있습니다. 구아바'에스 NullPointerTester.예를 들어, NullPointerTester 다음 메소드를 호출하려고 시도합니다 ...

Foo(String string, List<?> list) {
  checkArgument(string.length() > 0);
  // missing null check for list!
  this.string = string;
  this.list = list;
}

...두 개의 인수 목록이 있습니다. "", null 그리고 null, ImmutableList.of().이러한 각 호출이 예상되는 결과를 발생시키는지 테스트합니다. NullPointerException.이 구현을 위해 null 목록은 ~ 아니다 생산하다 NullPointerException.그러나 실제로는 다음과 같은 결과가 발생합니다. IllegalArgumentException 왜냐하면 NullPointerTester 기본 문자열을 사용하는 경우가 있습니다. "".만약에 NullPointerTester 단지 기대한다 NullPointerException ~을 위한 null 가치관이 있으면 버그를 잡아냅니다.그것이 기대된다면 IllegalArgumentException, 그리워요.

주관적인 질문이므로 닫혀야 하지만 여전히 열려 있습니다.

이는 이전 직장에서 사용했던 내부 정책의 일부이며 정말 잘 작동했습니다.모두 기억에 남는 내용이라 정확한 표현은 기억나지 않습니다.확인된 예외를 사용하지 않았다는 점은 주목할 가치가 있지만 이는 질문의 범위를 벗어납니다.그들이 사용한 확인되지 않은 예외는 3가지 주요 범주로 분류되었습니다.

NullPointer예외:고의로 던지지 마십시오.NPE는 Null 참조를 역참조할 때 VM에 의해서만 발생됩니다.이것들이 절대로 던져지지 않도록 가능한 모든 노력을 기울여야 합니다.이러한 오류를 찾으려면 @Nullable 및 @NotNull을 코드 ​​분석 도구와 함께 사용해야 합니다.

IllegalArgumentException:함수에 대한 인수가 공개 문서를 따르지 않을 때 발생합니다. 즉, 전달된 인수의 관점에서 오류를 식별하고 설명할 수 있습니다.OP의 상황은 이 범주에 속합니다.

IllegalState예외:함수가 호출되고 해당 인수가 전달될 때 예상치 못한 것이거나 메서드가 멤버인 객체의 상태와 호환되지 않는 경우 발생합니다.

예를 들어, 길이가 있는 항목에 사용된 IndexOutOfBoundsException의 두 가지 내부 버전이 있었습니다.인덱스가 길이보다 큰 경우 사용되는 IllegalStateException의 하위 클래스 중 하나입니다.다른 하나는 인덱스가 음수인 경우 사용되는 IllegalArgumentException의 하위 클래스입니다.이는 객체에 더 많은 항목을 추가할 수 있고 인수는 유효하지만 음수는 유효하지 않기 때문입니다.

내가 말했듯이 이 시스템은 정말 잘 작동하며 왜 차이점이 있는지 설명하는 데 누군가가 필요했습니다."오류 유형에 따라 무엇을 해야 할지 파악하는 것은 매우 간단합니다.실제로 무엇이 잘못되었는지 파악할 수 없더라도 해당 오류를 포착할 위치를 파악하고 추가 디버깅 정보를 생성할 수 있습니다."

NullPointer예외:Null 사례를 처리하거나 NPE가 발생하지 않도록 어설션을 삽입합니다.어설션을 넣으면 다른 두 가지 유형 중 하나일 뿐입니다.가능하다면 처음에 어설션이 있었던 것처럼 디버깅을 계속하세요.

IllegalArgumentException:통화 사이트에 문제가 있습니다.전달되는 값이 다른 함수에서 온 경우 잘못된 값을 받는 이유를 알아보세요.인수 중 하나를 전달하는 경우 예상한 결과를 반환하지 않는 함수를 찾을 때까지 오류가 호출 스택을 확인합니다.

IllegalState예외:올바른 순서로 함수를 호출하지 않았습니다.인수 중 하나를 사용하는 경우 해당 인수를 확인하고 문제를 설명하는 IllegalArgumentException을 발생시킵니다.그런 다음 문제를 찾을 때까지 볼을 스택에 대해 위로 전파할 수 있습니다.

어쨌든 그의 요점은 IllegalArgumentAssertions를 스택 위로만 복사할 수 있다는 것입니다.IllegalStateExceptions 또는 NullPointerExceptions는 함수와 관련이 있기 때문에 스택 위로 전파할 수 있는 방법이 없습니다.

다른 불법 인수에서 Null 인수를 골라내고 싶었기 때문에 IAE에서 NullArgumentException이라는 예외를 파생시켰습니다.예외 메시지를 읽을 필요도 없이 null 인수가 메서드에 전달되었음을 알 수 있으며 메시지를 읽으면 어떤 인수가 null인지 알 수 있습니다.여전히 IAE 핸들러를 사용하여 NullArgumentException을 포착하지만 내 로그에서 차이점을 빠르게 확인할 수 있습니다.

이분법...겹치지 않나요?전체에서 겹치지 않는 부분만이 이분법을 만들 수 있습니다.내가 보기에:

throw new IllegalArgumentException(new NullPointerException(NULL_ARGUMENT_IN_METHOD_BAD_BOY_BAD));

일부 컬렉션에서는 다음과 같이 가정합니다. null 다음을 사용하여 거부됩니다. NullPointerException 오히려 IllegalArgumentException.예를 들어 다음을 포함하는 집합을 비교하면 null 거부하는 세트로 null, 첫 번째 세트가 호출됩니다. containsAll 다른 한편으로는 그것을 잡아라. NullPointerException -- 하지만 IllegalArgumentException.(나는 구현을보고있다 AbstractSet.equals.)

이러한 방식으로 확인되지 않은 예외를 사용하는 것은 다음을 포함하는 컬렉션을 비교하는 반패턴이라고 합리적으로 주장할 수 있습니다. null 포함할 수 없는 컬렉션에 null 실제로 버그일 가능성이 높습니다. ~해야 한다 예외를 생성하거나 null 컬렉션에 전혀 나쁜 생각입니다.그럼에도 불구하고, 당신이 그렇게 말할 의지가 없다면 equals 그런 경우에는 예외를 던져야 하는데, 당신은 그 사실을 기억하지 못하고 있습니다 NullPointerException 특정 상황에서는 필요하지만 다른 상황에서는 필요하지 않습니다.("'c' 뒤를 제외한 NPE 앞의 IAE...")

현재 값이 null인 참조 변수를 사용하여 객체에 액세스하려고 하면 NullPointerException이 발생합니다.

메소드가 예상한 것과 다른 형식의 인수를 메소드가 수신할 때 IllegalArgumentException이 발생합니다.

귀하의 시나리오에 따르면, IllegalArgumentException 최선의 선택이니까요. 왜냐하면 null 귀하의 속성에 대한 유효한 값이 아닙니다.

이상적으로는 런타임 예외가 발생하지 않아야 합니다.귀하의 시나리오에 대해 확인된 예외(비즈니스 예외)가 생성되어야 합니다.이러한 예외 중 하나가 발생하고 기록되면 로그를 검토하는 동안 개발자에게 잘못된 안내를 제공하기 때문입니다.대신 비즈니스 예외로 인해 패닉이 발생하지 않으며 일반적으로 로그 문제 해결 중에 무시됩니다.

위의 두 가지 예외로의 링크에서 정의는 불법적입니다.메서드에 불법적이거나 부적절한 인수가 전달되었음을 나타내기 위해 발생합니다.NullPointer예외:객체가 필요한 경우 애플리케이션이 null을 사용하려고 하면 발생합니다.

여기서 가장 큰 차이점은 메서드에 대한 인수가 유효한지 확인할 때 IllegalArgumentException이 사용된다는 것입니다.NullPointerException은 객체가 null일 때 "사용"될 때마다 사용되어야 합니다.

두 가지 관점을 고려하는 데 도움이 되기를 바랍니다.

"setter"이거나 나중에 멤버를 사용할 수 있는 곳이라면 IllegalArgumentException을 사용하는 경향이 있습니다.

지금 메서드에서 사용(역참조)할 항목이라면 사전에 NullPointerException을 발생시킵니다.유용한 메시지를 제공할 수 있기 때문에 런타임에서 수행하도록 하는 것보다 이것이 더 좋습니다(런타임에서도 이 작업을 수행할 수 있는 것처럼 보이지만 이는 나중에 이야기할 내용입니다).

메서드를 재정의하는 경우 재정의된 메서드에서 사용하는 모든 것을 사용합니다.

IllegalArgumentException을 발생시켜야 합니다. 이렇게 하면 프로그래머가 잘못된 작업을 수행했음이 분명해집니다.개발자는 VM이 ​​던진 NPE를 보는 데 너무 익숙해서 어떤 프로그래머라도 자신의 오류를 즉시 깨닫지 못하고 무작위로 둘러보기 시작하거나 더 나쁘게는 '버그가 있다'고 코드를 비난하기 시작합니다.

이 경우 IllegalArgumentException은 API를 사용하는 사용자에게 "null이 아니어야 합니다"라는 명확한 정보를 전달합니다.다른 포럼 사용자가 지적했듯이 API를 사용하여 사용자에게 올바른 정보를 전달하는 한 원하는 경우 NPE를 사용할 수 있습니다.

GaryF와 Tweakt는 NPE 사용을 권장하는 "Effective Java"(내가 맹세하는) 참조를 삭제했습니다.그리고 다른 좋은 API가 어떻게 구성되어 있는지 살펴보는 것이 API를 구성하는 방법을 확인하는 가장 좋은 방법입니다.

또 다른 좋은 예는 Spring API를 살펴보는 것입니다.예를 들어, org.springframework.beans.BeanUtils.instantiateClass(Constructor ctor, Object[] args)에는 Assert.notNull(ctor, "Constructor must be null") 행이 있습니다.org.springframework.util.Assert.notNull(Object object, String message) 메소드는 전달된 인수(객체)가 null인지 확인하고, null이면 새로운 IllegalArgumentException(message)을 발생시키고 조직에서 포착됩니다. springframework.beans.BeanUtils.instantiateClass(...) 메서드.

NPE를 발생시키기로 선택하고 메서드에서 인수를 사용하는 경우 null을 명시적으로 확인하는 것은 중복되고 비용이 많이 들 수 있습니다.내 생각엔 VM이 이미 그런 일을 하고 있는 것 같아요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top