2016-09-15 5 views
2

답변자가 보다 NullReferenceException을 선호한다고 언급 한 this post을 읽었습니다.NullReferenceException 대 ​​ArgumentNullException

MSDN 언급 NullReferenceException에 대한 :

null 객체 참조 역 참조에 대한 시도가있을 때 throw되는 예외입니다. ArgumentNullExceptionthey

말 :

null 참조가 (Visual Basic의 경우 Nothing) 유효한 인수로 사용하지 않는 메서드에 전달 될 때 throw되는 예외입니다.

답장자 중 하나를 사용할 수 있다고합니다.

다른 이유 중 하나를 선택해야하는 이유가 있습니까?

P.S.

나는이 의견을 바탕으로 의견을 말할 수 있습니다. 사실, 상황 및 상황을 원합니다. 나는 personnal 환경 설정에 관심이 없습니다.

+1

* 다른 하나를 선택해야합니다. * 어떤 것을 던져야하나요, 어떤 일을 일으켜야합니까? – DaveShaw

+1

답변이이 질문과 관련이있는 http://stackoverflow.com/questions/463302/argumentnullexception-or-nullreferenceexception-from-extension-method과 매우 유사한 질문입니다. – hatchet

+1

어느 쪽도 사용할 수 없습니다. NRE는 dereferencing null로 실제로 죽은 프로그램을 위해 예약되어야합니다. NRE에서 ArgumentNullException을 사용하여 * 넘어지지 않도록 방지합니다. 클라이언트 프로그래머에게 "나는 * 당신이 잘못하고 있음을 알고있다. 결코 널 귀찮게하지 않는다."라고 말한다. NRE는 그런 절묘한 메시지를 보내지 않습니다. 던져 질 때 그것이 당신의 버그인지 또는 도서관의 버그인지 확신 할 수 없습니다. –

답변

10

코드에 명시 적으로 예외가 발생하는 경우 ArgumentNullException을 선택해야합니다. Null 참조/포인터 역 참조 할 때

NullReferenceException는 CLR에 의해 자동으로 발생합니다 :

이 가장 일반적으로 메서드 또는 속성이 Null 참조에 호출 될 때 발생
unsafe 
{ 
    int* ptr = (int*)0; // Casting 0 to pointer is null reference. 
    int val = *ptr; // NullReferenceException thrown. 
} 

:

string s = null; 
string substring = s.Substring(0, 2); // NullReferenceException thrown. 

에서 대부분의 경우 NullReferenceException을 코드에서 명시 적으로 throw해서는 안됩니다.

ArgumentNullException은 일반적으로 NullReferenceException을 방지하기 위해 null 참조가 매개 변수로 전달되는 경우를 확인하는 데 사용됩니다.

static string firstTwo(string s) 
{ 
    if (s == null) 
    { 
     throw new ArgumentNullException("s"); 
    } 
    return s.Substring(0, 2); // without the original check, this line would throw a NullReferenceException if s were null. 
} 

이 점검의 목적은 호출자에게 널 (null)이 전달되었고 널 (null)이 허용되지 않음을 분명히 알리는 것입니다. 당신은 단순히 NullReferenceException 슬로우 할 경우 체크를 사용하는 경우 그렇지 않은 경우, 발신자는 (

개체 참조가이만큼 의미가 아닌 객체

의 인스턴스로 설정되지 않았습니다 볼 것) :

값은 null 일 수 없습니다.매개 변수 이름 : 그들은 모양의

+0

** CLR **이란 무엇입니까? – Chax

+1

@Chax 공용 언어 런타임. 기본적으로 모든 .NET 프로그램의 "under-the-covers"구현 –

0

심지어 프레임 워크 확장 방법 대신 ArgumentNullExceptions 던져하는 NullReferenceException 던질 것입니다 : 코드 만보고에서

List<string> list = null; 
var results = list.Select(x => x); //ArgumentNullException 

을 (그리고 사전 지식없이 선택을 확장 한 것을 방법) 프레임 워크도이 상황에서 던져하지 않는 경우이 ... NullReferenceException가 발생한다, 나는 항상 ArgumentNullException

1

01을 사용하는 스틱 것은 이 아니며은 의도적으로 던집니다 입니다. 그것은 의도하지 않은 선행 위반을 신호합니다. 따라서 거의 항상 버그를 알립니다. 버그가 예외를 throw하는 코드에 있습니다.

모두 NullReferenceException은 규칙에 따라 버그로 간주되어야합니다. 99 %는 진정한 버그입니다. 1 %는 실제 버그가 아니지만 시간을 지켜서 방지하고 더 의미있는 예외 유형을 던져 대회를 지킬 가치가 있습니다.

Argument*Exception을 사용하면 전달 된 인수를 거부 함을 알릴 수 있습니다. NullReferenceException은이 예외를 throw하는 프로그래머가 오류를 발생했음을 의미합니다.

NullReferenceException을 런타임에서 제공 한 실패한 어설 션으로 처리하십시오. Argument*Exception은 "이 사건에 대해 생각하고 의식적으로 거부합니다."라는 의미입니다.