문제

를 받은 경우는 nullpointerexception 이 호출에서 다음과 같다:

someObject.getSomething().getSomethingElse().
    getAnotherThing().getYetAnotherObject().getValue();

내가 오히려 쓸모없는 예외과 같은 텍스트:

Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)

나는 그것을 발견하는 것이 아니라 열심히 찾을 수 있어 호출에 실제로 returend null,종종 자신을 찾는 refactoring 코드를 무언가 이것을 좋아한다:

Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();

기다리는 다음에 대한 설명이 포함된 nullpointerexception 이 말하는 나에게 줄 수 있습니다.

의 일부이 아니라고 생각할지도 모르는 concatening getters 은 나쁜 스타일을 피해야 합니다 어쨌든,그러나 나의 질문은:을 찾을 수 있습니 버그를 변경하지 않고 코드?

힌트:나는 이클립스를 사용하여 나는 무엇을 알고 디버거를 수는 없지만 figuere 그것을 적용하는 방법을 문제입니다.

나의 결론에 대한 답변:
어떤 답을 내게 말했어야지 체인이 필요한 것입 한 후,다른 어떤 답변을 보였 나의 디버깅하는 방법을 내 코드는 경우 나 disobayed 는 조언.

나는 허용되는 답변을 가르쳐 궤도에 유지하면서 더 먹을 때 체인이 필요한 것입:

  • 할 수 없는 경우 null 을 반환,체인 그들을 만큼 당신 같습니다.가 필요없 검사!= null,에 대해 걱정할 필요가 없 공개적으로 연결됩(경고하는 체인 아직도 vialotes 법의 데메테르,그러나 내가 살 수 있는)
  • 면 null 을 반환할 수 있습지,지금까지 결코 이제까지 체인,그리고 검사를 수행하는 null 값을 각각에는 null 을 반환할 수 있습

이것은 어떤 좋은 조언을 실제 디버깅용없습니다.

도움이 되었습니까?

해결책

대답하는 방법에 따라 보기(계약의)의 getters.만약 그들이 반환할 수 있습니다 null 당신이 정말로 반환 값을 검사합니다.는 경우 게터 반환하지 않아야 합니다 null, getter 포함해야 확인 및 예외를 throw(IllegalStateException?) 대신 돌아 null, 즉,당신은하지 않겠다고 약속을 반환합니다.Stacktrace 당신을 가리 킵니다 정확한 getter.수도 예기치 않은 상태의 게터에서 발견하는 예외 메시지입니다.

다른 팁

NPE 가장 쓸모없는 예외에서 Java,기간입니다.그것은 있을 것 같은 항상 느리게 구현되지 정확히 알려줍니다 무엇에도,그것으로 간단하"x 클래스.y.Z null"많은 도움이 될 것이 디버깅하는 등의 경우에는 예외로 합니다.

어쨌든 좋은 방법을 발견했을 찾 NPE 던지는 이러한 경우는 다음과 같은 종류의 refactoring:

someObject.getSomething()
          .getSomethingElse()
          .getAnotherThing()
          .getYetAnotherObject()
          .getValue();

거기 당신은 그것을 지금 NPE 포인트를 올바른 라인과 따라서 올바른 방법을 던져 실제 NPE.인 솔루션으로 나는 그것을 원하지만,그것은 작동합니다.

에 IntelliJ IDEA 설정할 수 있습니다 exceptionbreakpoints.그 중단점을 불 때마다 지정된 예외가 발생(범위를 지정할 수 있습니다 이 패키지에는 클래스).

는 방법을 쉽게 찾을 수 있어야의 원 NPE.

나는 가정,당신이 무언가를 할 수 있는 유사에서 netbeans 또는 eclipse.

편집: 이는 방법에 대한 설명을 추가하려면 exceptionbreakpoint eclipse

는 경우에 당신은 자신을 찾을 자주 쓰기:

a.getB().getC().getD().getE();

이것은 아마도 코드 냄새와 피해야 합니다.할 수 있습 리팩터,예를 들어,로 a.getE() 는 전화 b.getE() 는 전화 c.getE() 는 전화 d.getE().(이 예제하지 않을 수 있습에 대한 이해의 특정 사용하는 경우,그러나 그것은 하나의 패턴에 대한 고정이 이 코드는 냄새가 있다.)

법의 데메테르, 는 말합니다:

  • 당신의 방법을 호출할 수 있는 다른 방법에 해당 클래스에 직접
  • 당신의 방법을 호출 할 수 있습 방법을 자체에 직접 필드를(그에 필요한 필드)
  • 할 때의 방법은 매개변수는 당신의 방법을 수 있는 메소드를 호출에 매개 변수를 직접 있습니다.
  • 을 때 당신의 방법을 만들 지역 개체하는 방법을 호출할 수 있는 방법에서 지역 개체입니다.

따라서,하나가 없어야의 체인 메시지,예를 들어, a.getB().getC().doSomething().다음과 같은 이""율법은 더 많은 혜택을 만드는 떨어져 공개적으로 연결됩 쉽게 디버깅.

나지 않는 일반적으로 체인이 필요한 것입이 어디에 있는 하나 이상의 널 getter.

실행하는 경우 내부 ide 할 수 있습니다 그냥 중단점을 설정하고 사용하는"표현 평가"의 기능 ide 각 요소에 대해 연속적으로.

하지만 당신은 것 머리를 긁적 순간을 이 오류 메시지가 표시에서의 생산 server logs.그래서 최고의 유 최대 하나 널 항목을 입력합니다.

한편 우리는 꿈을 꿀 수의 그루비의 안전한 네비게이션 연산자

초기 실패 또한 옵션입니다.

어디에서나 귀하의 코드는 null 값을 반환할 수 있습,비즈니스를 이끌어 가는 방법입니에 대한 확인 null 이 반환 값.

public Foo getSomething()
{
  Foo result;
  ...
  if (result == null) {
    throw new IllegalStateException("Something is missing");
  }
  return result;
}

를 찾는 방법은 다음과 같습니다면,버그를 사용하여 Eclipse.

첫째,중단점을 설정 라인:

someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();

프로그램을 실행하는 디버그 모드에서 허용 디버거로 전환을 그것의 원근법을 때 라인입니다.

지금 하이라이트"someObject"CTRL+SHIFT+I(또는 마우스 오른쪽 버튼으로 클릭하고"말 검사").

그것은 null?을 발견했습 NPE.그것은 null 이 아닌?다음을 강조 표시 someObject.getSomething()(포함 괄호)검사니다.그것은 null?Etc.아래로 계속 체인을 파악하 NPE 발생을 변경하지 않고,당신의 코드입니다.

당신이를 참조 할 수 있습니다 이 질문에 대한 피!= null.

기본적으로,null 인 경우 유효한 응답,당신은 당신을 확인합니다.하지 않을 경우,그것을 주장(할 수 있는 경우).그러나 당신이 무엇 이건,최소화하기 위해 경우에는 null 유효한 대응을 위해 이 사이에 다른 이유가 있습니다.

만약 당신이 필요가 있는 곳으로 당신은 분할 선이나 정교한 디버깅을 자제하는 일반적으로 하나님의 말하는 방법 당신이 당신의 코드가 없는 검사에 대해 null 초기에 충분하다.

이 있는 경우 방법이나 생성자를 사용하는 개체 매개변수와 개체/메서드에서 질문할 수 없는 현명하게 처리하는 변수는 null,다음 확인을 던져 nullpointerexception 이 있음.

본 발명 사람들"코딩 스타일에"규칙을 시도하고 이 문제와 같은"당신은 허용되지 않는 하나 이상의 점에선".하지만 이것은 단지 장려 프로그램이 관광 명소로는 버그에서 잘못된 위치에 있습니다.

연결 표현처럼 그는 고통을 디버깅을 위해 공개적으로 연결됩(그리고 가장 기타 문제가 발생할 수 있는)그래서 나는 당신이 시도하고 있습니다.당신은 아마 듣는 충분한 비와 같은 이전에 언급한 포스터를 추가할 수 있습 브레이크 포인트에서 실제 nullpointerexception 이를 발생했습니다.

Eclipse 에서(그리고 가장 Ide)사용할 수도 있습니다 시계 표현을 평가에서 실행되는 코드를 디버거.당신이 이렇게 부를 선택하는 코드를 사용하여 contet 메뉴를 추가하는 새로운 시계입니다.

당신의 제어 방법는 null 을 반환합을 사용할 수도 있습 Null 개체 패턴 null 인 경우가 유효한 값을 반환합니다.

각 getter 에서 자신의 라인 및 디버깅할 수 있는지입니다.단계(F6)각 방법을 찾아 부르는 null 을 반환합니다

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