이 문서는 기계 번역을 이용하여 번역되었습니다. 문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

NullReferenceException 클래스

 

게시 날짜: 2016년 11월

null 개체 참조를 역참조하려고 할 때 throw되는 예외입니다.

네임스페이스:   System
어셈블리:  mscorlib(mscorlib.dll에 있음)

System.Object
  System.Exception
    System.SystemException
      System.NullReferenceException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class NullReferenceException : SystemException

이름설명
System_CAPS_pubmethodNullReferenceException()

새 인스턴스를 초기화는 NullReferenceException 설정 클래스는 Message "'null' 값을 찾을 수 있는 개체의 인스턴스 필요 했습니다."와 같은 오류를 설명 하는 시스템 제공 메시지로 새 인스턴스의 속성 이 메시지는 현재 시스템 문화권을 고려합니다.

System_CAPS_protmethodNullReferenceException(SerializationInfo, StreamingContext)

serialize된 데이터를 사용하여 NullReferenceException 클래스의 새 인스턴스를 초기화합니다.

System_CAPS_pubmethodNullReferenceException(String)

지정된 오류 메시지를 사용하여 NullReferenceException 클래스의 새 인스턴스를 초기화합니다.

System_CAPS_pubmethodNullReferenceException(String, Exception)

지정된 오류 메시지와 해당 예외의 원인인 내부 예외에 대한 참조를 사용하여 NullReferenceException 클래스의 새 인스턴스를 초기화합니다.

이름설명
System_CAPS_pubpropertyData

예외에 대한 사용자 정의 추가 정보를 제공하는 키/값 쌍의 컬렉션을 가져옵니다.(Exception에서 상속됨)

System_CAPS_pubpropertyHelpLink

이 예외와 연결된 도움말 파일에 대한 링크를 가져오거나 설정합니다.(Exception에서 상속됨)

System_CAPS_pubpropertyHResult

특정 예외에 할당된 코드화된 숫자 값인 HRESULT를 가져오거나 설정합니다.(Exception에서 상속됨)

System_CAPS_pubpropertyInnerException

현재 예외를 발생시킨 Exception 인스턴스를 가져옵니다.(Exception에서 상속됨)

System_CAPS_pubpropertyMessage

현재 예외를 설명하는 메시지를 가져옵니다.(Exception에서 상속됨)

System_CAPS_pubpropertySource

오류를 발생시키는 응용 프로그램 또는 개체의 이름을 가져오거나 설정합니다.(Exception에서 상속됨)

System_CAPS_pubpropertyStackTrace

호출 스택의 직접 실행 프레임 문자열 표현을 가져옵니다.(Exception에서 상속됨)

System_CAPS_pubpropertyTargetSite

현재 예외를 throw하는 메서드를 가져옵니다.(Exception에서 상속됨)

이름설명
System_CAPS_pubmethodEquals(Object)

지정한 개체가 현재 개체와 같은지 여부를 확인합니다. (Object에서 상속됨)

System_CAPS_protmethodFinalize()

개체가 가비지 수집자에서 회수되기 전에, 해당 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)

System_CAPS_pubmethodGetBaseException()

파생 클래스에서 재정의된 경우 하나 이상의 후속 예외의 근본 원인이 되는 Exception을 반환합니다.(Exception에서 상속됨)

System_CAPS_pubmethodGetHashCode()

기본 해시 함수로 작동합니다.(Object에서 상속됨)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

파생 클래스에서 재정의된 경우 예외에 관한 정보를 SerializationInfo에 설정합니다.(Exception에서 상속됨)

System_CAPS_pubmethodGetType()

현재 인스턴스의 런타임 형식을 가져옵니다.(Exception에서 상속됨)

System_CAPS_protmethodMemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.(Object에서 상속됨)

System_CAPS_pubmethodToString()

현재 예외에 대한 문자열 표현을 만들고 반환합니다.(Exception에서 상속됨)

이름설명
System_CAPS_proteventSerializeObjectState

예외에 대한 serialize된 데이터를 포함하는 예외 상태 개체를 만들기 위해 예외를 serialize할 때 발생합니다.(Exception에서 상속됨)

A NullReferenceException 값 형식의 멤버에 액세스 하려고 할 때 예외가 throw 됩니다 null합니다. A NullReferenceException 예외에서 일반적으로 개발자 오류를 반영 하 고 다음과 같은 시나리오에서 throw 됩니다.

  • 참조 형식을 인스턴스화할 하지 않았습니다. 다음 예에서 names 선언 되었지만 절대 인스턴스화되지 않습니다.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main(string[] args)
       {
          int value = Int32.Parse(args[0]);
          List<String> names;
          if (value > 0)
             names = new List<String>();
    
          names.Add("Major Major Major");       
       }
    }
    // Compilation displays a warning like the following:
    //    Example1.vb(10) : warning BC42104: Variable //names// is used before it 
    //    has been assigned a value. A null reference exception could result 
    //    at runtime.
    //    
    //          names.Add("Major Major Major")
    //          ~~~~~
    // The example displays output like the following output:
    //    Unhandled Exception: System.NullReferenceException: Object reference 
    //    not set to an instance of an object.
    //       at Example.Main()
    

    일부 컴파일러에서는이 코드를 컴파일할 때 경고가 발생 합니다. 다른 오류를를 실행 하 고, 컴파일이 실패 합니다. 해당 값이 더 이상 더이 문제를 해결 하기 위해 개체를 인스턴스화할 null합니다. 다음 예제에서는 형식의 클래스 생성자를 호출 하 여이 수행 합니다.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • 배열 초기화 하기 전에 차원 하지 않았습니다. 다음 예에서 values 정수 배열을 것으로 선언 하지만 포함 된 요소의 수를 지정 하지 않습니다. 따라서 발생 하는 값 초기화를 시도 NullReferenceException 예외입니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = null;
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);   
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    다음 예제에서는 마찬가지로 초기화 하기 전에 배열의 요소 수를 선언 하 여 예외를 제거할 수 있습니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = new int[10];
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);   
       }
    }
    // The example displays the following output:
    //    0
    //    2
    //    4
    //    6
    //    8
    //    10
    //    12
    //    14
    //    16
    //    18
    

    선언 및 배열 초기화에 대 한 자세한 내용은 참조 하십시오. 배열(C# 프로그래밍 가이드)Visual Basic의 배열합니다.

  • 얻게는 null 메서드로부터 값을 반환 하 고 반환 되는 형식에서 메서드를 호출 합니다. 다음 경우에 따라은 문서 오류; 결과 메서드 호출이 반환 될 수 있는지 확인 하는 설명서 실패 null합니다. 경우에 따라 코드 잘못 가정 하는 메서드는 항상 반환 이외null 값입니다.

    다음 예제에서 코드를 가정 하는 Array.Find<T> 메서드는 항상 반환 Person 개체 FirstName 필드가 검색 문자열과 일치 합니다. 일치 항목이 없는 이기 때문에 런타임에서 throw 된 NullReferenceException 예외입니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra", 
                                              "Abraham", "Adrian", "Ariella", 
                                              "Arnold", "Aston", "Astor" } );    
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          Console.WriteLine(found.FirstName);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames) 
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       } 
    
       public String FirstName;
    }
    // The example displays the following output:
    //       Unhandled Exception: System.NullReferenceException: 
    //       Object reference not set to an instance of an object.
    //          at Example.Main()
    

    이 문제를 해결 하려면 있지 않은지 확인 하는 메서드의 반환 값을 테스트 null 호출 하기 전에 모든 해당 멤버의 다음 예제에서는 마찬가지로 합니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra", 
                                              "Abraham", "Adrian", "Ariella", 
                                              "Arnold", "Aston", "Astor" } );    
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          if (found != null)
             Console.WriteLine(found.FirstName);
          else
             Console.WriteLine("{0} not found.", nameToFind);   
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames) 
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       } 
    
       public String FirstName;
    }
    // The example displays the following output:
    //        Robert not found
    
  • 식을 사용 하는 (예를 들어 연결 메서드 또는 속성의 목록을 함께) 값을 검색 하 고 값이 있는지 여부를 확인 하지만 null, 런타임에서 throw 여전히는 NullReferenceException 예외입니다. 식의 중간 값 중 하나를 반환 하기 때문에 발생 하는이 null합니다. 결과적으로 사용자에 대해 나머지 null 계산 되지 않습니다.

    다음 예제에서는 정의 Pages 하 여 표시 되는 웹 페이지에 대 한 정보를 캐시 하는 개체 Page 개체입니다. Example.Main 메서드 인지 확인 하는 현재 웹 페이지에 null이 아닌 제목이, 그렇지 않으면 제목을 표시 합니다. 하지만 메서드에서 throw이 검사 불구 하 고는 NullReferenceException 예외입니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          if (! String.IsNullOrEmpty(pages.CurrentPage.Title)) {
             String title = pages.CurrentPage.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
       }
    }
    
    public class Pages 
    {
       Page[] page = new Page[10];
       int ctr = 0;
    
       public Page CurrentPage
       {
          get { return page[ctr]; }
          set {
             // Move all the page objects down to accommodate the new one.
             if (ctr > page.GetUpperBound(0)) {
                for (int ndx = 1; ndx <= page.GetUpperBound(0); ndx++)
                   page[ndx - 1] = page[ndx];
             }    
             page[ctr] = value;
             if (ctr < page.GetUpperBound(0))
                ctr++; 
          }
       }
    
       public Page PreviousPage
       {
          get {
             if (ctr == 0) { 
                if (page[0] == null)
                   return null;
                else
                   return page[0];
             }
             else {
                ctr--;
                return page[ctr + 1];
             }
          }
       }         
    }
    
    public class Page
    {
       public Uri URL;
       public String Title;
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    때문에 예외가 throw 된 pages.CurrentPage 반환 null 캐시에 저장 된 페이지 정보가 없는 경우. 값을 테스트 하 여이 예외를 해결할 수는 CurrentPage 현재 검색 하기 전에 속성 Page 개체의 Title 속성을 다음 예제와 같이 않습니다:

    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          Page current = pages.CurrentPage;
          if (current != null) {  
             String title = current.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
          else {
             Console.WriteLine("There is no page information in the cache.");
          }   
       }
    }
    // The example displays the following output:
    //       There is no page information in the cache.
    
  • 참조 형식 및 요소 중 하나를 throw 하는 프로세스를 포함 하는 배열의 요소를 열거 하는 NullReferenceException 예외입니다.

    다음 예제에서는 문자열 배열을 정의합니다. A for 문이 배열의 요소를 열거 하 고 호출 하는 각 문자열 Trim 문자열을 표시 하기 전에 메서드.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", values[ctr].Trim(), 
                           ctr == values.GetUpperBound(0) ? "" : ", "); 
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    배열의 각 요소는 null이 아닌 값을 포함 해야 하 고 배열 요소의 값이 실제로 가정 하는 경우이 예외가 발생 null합니다. 요소가 있는지 여부를 테스트 하 여 예외를 제거할 수 있습니다 null 해당 요소에 대 한 작업을 수행 하기 전에 다음 예제와 같이 보여 줍니다.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", 
                           values[ctr] != null ? values[ctr].Trim() : "", 
                           ctr == values.GetUpperBound(0) ? "" : ", "); 
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //       one, , two
    
  • A NullReferenceException 전달 되는 메서드가 예외를 throw null합니다. 일부 메서드는에 전달 된 인수를 확인 합니다. 수행 하 고 인수 중 하나가 null, 메서드에서 throw 한 System.ArgumentNullException 예외입니다. 그렇지 않으면 throw 된 NullReferenceException 예외입니다. 다음 예제에서는이 시나리오를 보여 줍니다.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = GetData();
          PopulateNames(names);
       }
    
       private static void PopulateNames(List<String> names)
       {
          String[] arrNames = { "Dakota", "Samuel", "Nikita",
                                "Koani", "Saya", "Yiska", "Yumaevsky" };
          foreach (var arrName in arrNames)
             names.Add(arrName);
       }
    
       private static List<String> GetData() 
       {
          return null;   
    
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.NullReferenceException: Object reference 
    //    not set to an instance of an object.
    //       at Example.PopulateNames(List`1 names)
    //       at Example.Main()
    

    이 문제를 해결 하기 위해 아닌지 확인 하는 메서드에 전달 된 인수 null에서 throw 된 예외를 처리 또는 한 try…catch…finally 블록입니다. 자세한 내용은 예외 처리 및 Throw을 참조하십시오.

The following Microsoft intermediate language (MSIL) instructions throw NullReferenceException: callvirt, cpblk, cpobj, initblk, ldelem.<type>, ldelema, ldfld, ldflda, ldind.<type>, ldlen, stelem.<type>, stfld, stind.<type>, throw, and unbox.

NullReferenceException0x80004003 값이 있는 HRESULT COR_E_NULLREFERENCE를 사용 합니다.

인스턴스에 대 한 초기 속성 값 목록은 NullReferenceException, 참조는 NullReferenceException 생성자입니다.

릴리스 코드에서 NullReferenceException 처리

일반적으로 발생 한 후 처리 하기 보다 nullreferenceexception이 발생 하지 않도록 하는 것이 좋습니다. 예외 처리로 인해 코드는 유지 관리하고 이해하기가 더 어려워지며 때로는 다른 버그가 발생할 수도 있습니다. NullReferenceException은 대개 복구할 수 없는 오류입니다. 이러한 경우 예외로 인해 앱이 중지되도록 하는 것이 최상의 방법일 수 있습니다.

하지만 오류 처리가 유용한 경우도 많이 있습니다.

  • 앱에서 null 개체를 무시할 수 있습니다. 예를 들어 앱에서 데이터베이스의 레코드를 검색하고 처리하는 경우 null 개체를 발생시키는 잘못된 레코드를 무시할 수 있습니다. 로그 파일이나 응용 프로그램 UI에 있는 잘못된 데이터를 기록하기만 하면 됩니다.

  • 예외에서 복구할 수 있습니다. 예를 들어 참조 형식을 반환하는 웹 서비스에 대한 호출은 연결이 끊어졌거나 연결 시간이 초과된 경우 null을 반환할 수 있습니다. 연결을 다시 설정한 다음 다시 호출할 수 있습니다.

  • 앱 상태를 올바른 상태로 복원할 수 있습니다. 예를 들어 NullReferenceException을 throw하는 메서드를 호출하기 전에 정보를 데이터 저장소에 저장하도록 하는 다단계 작업을 수행할 수 있습니다. 초기화되지 않은 개체로 인해 데이터 레코드가 손상될 경우 앱을 종료하기 전에 이전 데이터를 제거할 수 있습니다.

  • 그리고 예외 보고를 원할 수 있습니다. 예를 들어 앱 사용자의 실수로 오류가 발생한 경우 사용자가 올바른 정보를 제공할 수 있도록 도와 주는 메시지를 생성할 수 있습니다. 문제를 해결할 수 있도록 오류에 대한 정보를 기록할 수도 있습니다. ASP.NET과 같은 일부 프레임워크에는 앱이 충돌하지 않도록 모든 오류를 캡처하는 수준 높은 예외 처리기가 포함되어 있습니다. 이러한 경우 예외 발생 여부를 확인할 수 있는 방법은 예외를 로깅하는 것뿐입니다.

유니버설 Windows 플랫폼
8 이후 사용 가능
.NET Framework
1.1 이후 사용 가능
이식 가능한 클래스 라이브러리
이식 가능한 .NET 플랫폼 에서 지원됨
Silverlight
2.0 이후 사용 가능
Windows Phone Silverlight
7.0 이후 사용 가능
Windows Phone
8.1 이후 사용 가능

이 형식의 모든 public static(Visual Basic의 공유 Visual Basic의 경우) 멤버는 스레드로부터 안전합니다. 인스턴스 멤버는 스레드로부터의 안전이 보장되지 않습니다.

맨 위로 이동
표시: