Null 레퍼런스
Understand what causes a NullReferenceException in C# and how to avoid uninitialized object references.
읽는 시간 2분최근 업데이트: 한 달 전
C#의 은 값이 인 유형의 멤버에 액세스하려고 할 때 발생합니다. 런타임 시 이 발생하는 경우 오브젝트 레퍼런스 변수를 사용하기 전에 초기화하는 것을 잊어버린 경우가 많습니다. null 레퍼런스를 생성하는 일반적인 코딩 오류에 대한 전체 설명은 Microsoft 기술 자료를 참조하십시오.
NullReferenceExceptionnullNullReferenceExceptionnull 레퍼런스 오류 메시지는 다음과 같습니다.
NullReferenceException: Object reference not set to an instance of an object at Example.Start () [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10
이 오류 메시지는 스크립트 파일 의 10번째 줄에서 이 발생했으며, 함수 내에서 예외가 발생했음을 나타냅니다. 이렇게 하면 Null 레퍼런스 예외를 쉽게 찾고 수정할 수 있습니다. 이 예제에서 코드는 다음과 같습니다.
Example.csNullReferenceExceptionStart()using UnityEngine;using System.Collections;public class Example : MonoBehaviour { // Use this for initialization void Start () { GameObject myGameObject = GameObject.Find("exampleGameObject"); Debug.Log(myGameObject.name); } }
코드는 ‘exampleGameObject’라는 게임 오브젝트를 찾습니다. 이 예제에는 해당 이름의 게임 오브젝트가 없으므로 함수는 을 반환합니다. 다음 줄(9번째 줄)에서 스크립트는 변수를 사용하여 참조하는 게임 오브젝트의 이름을 출력합니다. 존재하지 않는 게임 오브젝트에 액세스하려고 하기 때문에 Unity는 을 반환합니다.
Find()nullmyGameObjectNullReferenceExceptionNull checks
이 예제의 솔루션은 특정 이름의 게임 오브젝트가 존재하지 않는 상황에 대한 결과를 포함하는 것입니다. 다음 스크립트는 변수가 을 반환하는지 확인하고, 그렇다면 메시지를 표시합니다.
gonullusing UnityEngine;using System.Collections;public class Example : MonoBehaviour { void Start () { GameObject myGameObject = GameObject.Find("exampleGameObject"); if (myGameObject == null) { Debug.Log("No GameObject called exampleGameObject found"); } else { Debug.Log(myGameObject.name); } } }
커스텀 == 연산자
UnityEngine.Object에서 상속하는 유형의 경우 Unity는 C# 같음 및 같지 않음 연산자의 커스텀 버전을 사용합니다. 즉, 이전 예제()의 null 체크는 가 기술적으로 유효한 C# 오브젝트 레퍼런스를 보유하고 있더라도 를 평가(및 반대로 이 를 평가)할 수 있습니다. 이는 다음 두 가지 경우에 발생합니다.
myGameObject == nullmyGameObjecttruemyGameObject != nullfalse- 해당 오브젝트는 Unity가 에디터에서 초기화되지 않은 MonoBehaviour 필드를 채우기 위해서만 사용하는 ‘fake null’ 또는 플레이스홀더 오브젝트일 수 있습니다. 이러한 오브젝트는 참조하려는 경우 이러한 필드의 소스를 찾는 데 도움이 되는 유용한 디버깅 정보를 저장합니다.
- 오브젝트는 아직 가비지 컬렉션이 이루어지지 않은 관리되는(C#) 오브젝트일 수 있지만 관리되지 않는(C++) 상대 오브젝트가 삭제되었기 때문에 null로 간주되어야 합니다.
Try/Catch 블록
Inspector 창에서 초기화해야 하는 변수를 사용하는 경우에도 Unity는 을 호출합니다. 이 작업을 잊으면 변수는 이 됩니다. 을 다루는 다른 방법은 / 블록을 사용하는 것입니다. 예시:
NullReferenceExceptionnullNullReferenceExceptiontrycatchusing UnityEngine;using System;using System.Collections;public class Example2 : MonoBehaviour { public Light myLight; // set in the inspector void Start () { try { myLight.color = Color.yellow; } catch (NullReferenceException ex) { Debug.Log("myLight was not set in the inspector"); } } }
이 코드 예제에서 라는 변수는 인스펙터 창에서 설정해야 하는 입니다. 이 변수가 설정되지 않으면 기본값은 입니다.
myLightLightnulltryNullReferenceExceptioncatch