개체 참조가 개체의 인스턴스로 설정되지 않았습니다. .NET에서 어떤 개체가 'null'인지 표시하지 않는 이유는 무엇입니까?
이 .NET 처리되지 않은 예외 메시지와 관련하여 :
개체 참조가 개체의 인스턴스로 설정되지 않았습니다.
.NET에서 어떤 객체가 표시되지 않는 이유는 무엇 null
입니까?
null
오류를 확인 하고 해결할 수 있다는 것을 알고 있습니다 . 그러나 .NET이 어떤 개체에 null 참조가 있고 어떤식이 NullReferenceException
?
(Visual Studio 2017의 새로운 예외 도우미에 대한 자세한 내용은이 답변의 끝 부분을 참조하세요.)
이 코드를 고려하십시오.
String s = null;
Console.WriteLine(s.Length);
이것은 NullReferenceException
두 번째 줄에 a 를 던지고 s
예외가 throw되었을 때 .NET 이 null 이라고 말하지 않는 이유를 알고 싶습니다 .
정보를 얻지 못하는 이유를 이해하려면 실행하는 것이 C # 소스가 아니라 IL이라는 점을 기억해야합니다.
IL_0001 : ldnull IL_0002 : stloc.0 // 초 IL_0003 : ldloc.0 // 초 IL_0004 : callvirt System.String.get_Length IL_0009 : System.Console.WriteLine 호출
callvirt
를 throw하는 것은 opcode이며 NullReferenceException
평가 스택의 첫 번째 인수가 null 참조 (를 사용하여로드 된 참조) 일 때이를 수행합니다 ldloc.0
.
.NET이 그것이 s
null 참조라는 것을 알 수 있어야한다면 어떤 식 으로든 평가 스택의 첫 번째 인수가 form에서 시작되었음을 추적해야합니다 s
. 이 경우 그것이 s
null이라는 것을 쉽게 알 수 있지만 값이 다른 함수 호출의 반환 값이고 어떤 변수에도 저장되지 않은 경우 어떻게 될까요? 어쨌든 이러한 종류의 정보는 .NET 가상 머신과 같은 가상 머신에서 추적하려는 정보가 아닙니다.
이 문제를 방지하려면 모든 공용 메서드 호출에서 인수 null 검사를 수행하는 것이 좋습니다 (물론 null 참조를 허용하지 않는 한).
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
메소드에 null이 전달되면 문제가 무엇인지 정확하게 설명하는 예외가 발생합니다 (즉, s
null).
4 년 후 Visual Studio 2017에는 a NullReferenceException
가 throw 될 때 null이 무엇인지 알려주는 새로운 예외 도우미가 있습니다. null 인 메서드의 반환 값일 때 필요한 정보를 제공 할 수도 있습니다.
이것은 DEBUG 빌드에서만 작동합니다.
다음과 같은 경우 오류 메시지를 어떻게 표시 하시겠습니까?
AnyObject.GetANullObject().ToString();
private object GetANullObject()
{
return null;
}
여기에보고 할 변수 이름이 없습니다!
음, Microsoft의 엔지니어가 대답해야합니다. 그러나 분명히 디버거를 사용하고 시계를 추가하여 어느 것이 문제가 있는지 알아낼 수 있습니다.
그러나 예외는 NullReferenceException
참조 가 존재하지 않음 을 의미 합니다 . 전혀 생성되지 않은 개체는 가져올 수 없습니다.
but why .NET don't tell us which object is null?
어떤 객체가 null인지 모르기 때문입니다. 개체는 단순히 존재하지 않습니다!
Same is the case when I say, C# is compiled to .NET IL code. The .NET IL code does not know the names or expressions. It only knows references and their location. Here too, you cannot get what does not exist. The expression or the variable name does not exist.
Philosophy: You cannot make an omlette if you don't have an egg in the first place.
Not sure, but this may be because .Net doesn't knows whether it is predefined class or user-defined. If it is predefined then it can be null(like string which occupies 2 Bytes) but if it is user-defined than we have to create an instance of it so that it knows that this object will occupy this much memory. So therefore it throws error at run-time.
좋은 질문. 메시지 상자는 쓸모가 없습니다. 참조 정의에서 1 마일 깊이 묻혀 있어도 일부 클래스 나 어셈블리 또는 파일 또는 기타 정보가 현재 제공하는 것보다 낫습니다 (읽기 :없는 것보다 낫습니다).
가장 좋은 방법은 디버깅 정보와 함께 디버거에서 실행하는 것입니다. 그러면 IDE가 문제가되는 줄에서 중단됩니다 (실제로 유용한 정보를 사용할 수 있음을 명확하게 보여줌).
'programing tip' 카테고리의 다른 글
자바에서지도의 얕은 사본 (0) | 2020.08.15 |
---|---|
allowDefinition = 'MachineToApplication'VS2010에서 게시 할 때 오류 발생 (이전 빌드 이후에만) (0) | 2020.08.15 |
Kotlin의 단일 느낌표 (0) | 2020.08.15 |
NVIDIA vs AMD : GPGPU 성능 (0) | 2020.08.15 |
자바 스크립트 콘솔에서 컨텍스트를 iframe으로 변경하는 방법이 있습니까? (0) | 2020.08.15 |