3

코드 :왜 디버거/런타임에서 어떤 객체가 null인지 알 수 없습니까?

items.FirstOrDefault(x => x.Foo.Bar.BarId == snuh.BarId); 

오류 : 널 오브젝트가 items, Foo, Bar, 또는 snuh

System.NullReferenceException: Object reference not set to an instance of an object.

.

디버거/런타임에서 오류가 발생한 코드 줄을 알 수 있습니다. 왜 그것은 어떤 물체가 문제인지를 알 수없는 이유는 무엇입니까?

참고 : 나는 이것을 디버깅하고 대답을 찾을 수 있습니다. Visual Studio에서 문제가되는 개체의 이름을 알려줄 수없는 이유가 있습니까?

+0

Lampba 표현에 대한이 게시물과 관련된 것으로 보이며 디버그 할 수 없다고 생각합니다. http : //stackoverflow.com/questions/725499/vs-debugging-quick-watch-tool-and-lambda -expressions – Bit

+1

실제로 x는 null 일 수도 있습니다. 많은 컬렉션을 사용하면 null을 항목으로 목록에 추가 할 수 있습니다. –

+0

null 참조가 생성 된 개체를 모르는 코드가 null 참조를 감지했습니다. sqrt (x)를 할 때 x가 음수 일 때 sqrt 함수는 "변수 x에서 음수의 제곱근을 취할 수 없다"고 말해야하는 것과 같습니다. –

답변

2

디버거 또는 컴파일러에는 소스 기호가 있으므로 이름에 주소를 매핑 할 수 있습니다.

그러나 런타임은 소스 코드에서 참조가 명명 된 방식 (컴파일 된 방식)을 알지 못합니다.

CLR이 아닌 사용자가 NullReferenceException을 throw하면 삽입 된 메시지에 정보를 추가 할 수 있습니다.

+0

예외를 던지려면'try .. catch ... '블록을 통해 null 인 객체에 대한 자신 만의 정보를 추가 할 수 있고 좋은 설명이 될 수 있다고 언급했기 때문에이 대답을 +1하십시오. – Jfabs

+0

하지만 디버거에서 실행 중일 때는 어떻습니까? 디버거가 내게 말할 수 있어야합니까? –

+0

@BobHorn - 디버거가 예외를 넘겨주고 원래 발생한 행을 확인할 수 있습니다 (운이 좋다면). 각 부분을 다시 실행하고 추가로 'NULL'검사를 삽입하는 것이 라인의 * 일부 *를 판별 할 수있는 유일한 방법이지만 라인은 결정 론적이고 부작용이없는 것으로 가정하고 디버거는 그렇게하지 않고 안전하게 플레이합니다. –

0

null 포인터를 받고 객체를 지정하지 않는 것은 대부분의 언어에서 매우 일반적입니다. 나는 그것이 무엇인지 알려주기 위해 처음부터 객체를 찾을 수 없기 때문에 그것의 확신합니다.

+0

객체를 찾을 수없는 경우 어떻게 null인지를 어떻게 알 수 있습니까? – Bit

+0

가리킨 메모리 주소에서 아무 것도 찾을 수 없기 때문에. –

2

최적화 등으로 인해 "R22/스택 슬롯에 앉아이 슬롯 5에 저장 됨"과 그 참조를 실제로 얻은 방법은 추론하기가 어려울 수 있습니다.

이 순간에 참조를 시도한 사람이 누구이며 NULL 인 것으로 나타났습니다.

간혹 역 참조하려고하는 것이 소스 코드에서 명확하고 이해할 수있는 이름을 갖고 있지 않을 수도 있습니다.

관련 문제