someMethod 함수가 실행되는 이유가 확실하지 않습니다.왜이 두 행은 NullPointerException 프로그램입니까?
답변
이 코드는 ldnull
다음에 ldvirtftn
명령으로 컴파일됩니다. ldvirtftn
(4.18)에 대한 ECMA-335에서 :
System.NullReferenceException 객체가 null의 경우에 슬로우 입니다.
ToString은 호출하지 않지만 ldvirtftn
명령어는 ToString에 대한 함수 포인터를 평가 스택에로드하려고 시도합니다. 그렇게하려면 유효한 객체 참조가 필요합니다.
Func<Object> someMethod = new Func<Object>(((Object)null).ToString);
그것은 실행되지,하지만 당신은 null 참조에 방법을ToString()
에 액세스하려고합니다.
(null) null은 여전히 null입니다. null.ToString()을 호출하려고하는데, 이것이 NullPointerException을 얻는 이유입니다.
왜 누군가는 그런 일을 할 것입니다 .. – Bastardo
기술적으로 코드는 ToString을 호출하지 않고 Func
- 1. 이상한 NullPointerException
- 2. NullPointerException
- 3. NullPointerException : 두 개의 콜렉션과 for 루프
- 4. 왜이 두 구조체의 크기가 다른가요?
- 5. 왜이 두 문장의 결과가 다른가요?
- 6. 왜이 두 기능의 출력이 다른가요?
- 7. 행은 오라클
- 8. 삭제 행은
- 9. TabWidget NullpointerException?
- 10. 어떤 플래시 응용 프로그램입니까?
- 11. 파일을 손상시키는 프로그램입니까?
- 12. hadoop NullPointerException
- 13. JSP의 NullPointerException
- 14. Home.onCreate에서 NullPointerException
- 15. res.getIdentifier의 NullPointerException
- 16. PHP POST 여러 행은 MySQL의
- 17. 왜이 두 페이지가 다르게 표시됩니까? 페이지 정보
- 18. Android : 왜이 대화 상자가 두 번 팝업됩니까?
- 19. 왜이 두 텍스트 파일의 차이점은 무엇입니까?
- 20. 왜이 두 생성자가 모두 클래스에 있습니까?
- 21. 왜이 두 문자열에 줄 바꿈이 다른가요?
- 22. 수정 행은 MySQL의
- 23. 이동 및 삭제 행은
- 24. jQuery를 DataTable의 행은
- 25. SQL 서버 행은
- 26. SQL의 후보 행은 무엇입니까?
- 27. MySQL을 제거 중복 행은
- 28. python이 행은 무엇을하고 있습니까?
- 29. 각 행은 adodb의 객체입니까?
- 30. CSS 정렬 된 행은
그럼 코드를 새 Object()로 다시 작성했다고 가정 해 봅시다. Object가 public 생성자를 가지지 않는다면 나는 막혀있을 것 같습니다. 이 경우 우리는 무엇을 할 수 있습니까? – Dejas
이 특별한 경우의 문제점은 ToString이 가상 메서드라는 것입니다 (따라서 ldftn 대신 ldvirtftn이 사용되는 이유). CLR은 클래스 계층에서 재정의 된 내용에 따라 실제 ToString에 대한 포인터를 반환 할 수 있도록 객체에 대한 참조가 필요합니다. 가상 메서드가 아닌 경우에도이 트릭을 수행하더라도 Func의 생성자는 전달 된 인스턴스에서 null을 확인하기 때문에 throw됩니다. 결론은 인스턴스 메소드에 대한 델리게이트를 구성하려는 경우 널이 아닌 참조가 필요하다는 것입니다. –
@Dejas : 요약하면 : 인스턴스 메서드에 대한 대리자를 구성 할 수 있도록 형식의 인스턴스에 어떻게 든 도착해야합니다. 이전에 언급 한 이유 때문에 null 참조가 작동하지 않습니다. –