मान प्रकार बनाम संदर्भ प्रकार
कई प्रोग्रामिंग भाषाओं में, चर को "डेटा प्रकार" कहा जाता है। दो प्राथमिक डेटा प्रकार मूल्य प्रकार (इंट, फ्लोट, बूल, चार, स्ट्रक्चर, ...) और संदर्भ प्रकार (कक्षाओं का उदाहरण) हैं। जबकि मान प्रकारों में स्वयं मान होता है , संदर्भों में एक मेमोरी एड्रेस होता है जो मानों के एक सेट (C / C ++ के समान) को शामिल करने के लिए आवंटित मेमोरी के एक हिस्से की ओर इशारा करता है।
उदाहरण के लिए, Vector3
एक मान प्रकार (निर्देशांक और कुछ कार्यों से युक्त एक संरचना) है, जबकि आपके GameObject से जुड़े घटक (जिसमें आपकी कस्टम स्क्रिप्ट शामिल MonoBehaviour
हैं) संदर्भ प्रकार हैं।
मेरे पास NullReferenceException कब हो सकती है?
NullReferenceException
फेंक दिया जाता है जब आप एक संदर्भ चर का उपयोग करने की कोशिश करते हैं जो किसी भी वस्तु को संदर्भित नहीं कर रहा है, इसलिए यह शून्य है (स्मृति पता 0 की ओर इशारा करता है)।
कुछ सामान्य स्थानों NullReferenceException
को उठाया जाएगा:
एक गेमऑब्जेक्ट / घटक में हेरफेर जो निरीक्षक में निर्दिष्ट नहीं किया गया है
// t is a reference to a Transform.
public Transform t ;
private void Awake()
{
// If you do not assign something to t
// (either from the Inspector or using GetComponent), t is null!
t.Translate();
}
एक घटक को पुनः प्राप्त करना जो GameObject से जुड़ा नहीं है और फिर, इसे हेरफेर करने की कोशिश कर रहा है:
private void Awake ()
{
// Here, you try to get the Collider component attached to your gameobject
Collider collider = gameObject.GetComponent<Collider>();
// But, if you haven't any collider attached to your gameobject,
// GetComponent won't find it and will return null, and you will get the exception.
collider.enabled = false ;
}
गेमऑबजेक्ट तक पहुँचना मौजूद नहीं है:
private void Start()
{
// Here, you try to get a gameobject in your scene
GameObject myGameObject = GameObject.Find("AGameObjectThatDoesntExist");
// If no object with the EXACT name "AGameObjectThatDoesntExist" exist in your scene,
// GameObject.Find will return null, and you will get the exception.
myGameObject.name = "NullReferenceException";
}
नोट: रहो सावधान, GameObject.Find
, GameObject.FindWithTag
, GameObject.FindObjectOfType
केवल gameObjects कि कर रहे हैं वापसी सक्षम पदानुक्रम में जब समारोह कहा जाता है।
एक गटर के परिणाम का उपयोग करने की कोशिश कर रहा है जो वापस आ रहा है null
:
var fov = Camera.main.fieldOfView;
// main is null if no enabled cameras in the scene have the "MainCamera" tag.
var selection = EventSystem.current.firstSelectedGameObject;
// current is null if there's no active EventSystem in the scene.
var target = RenderTexture.active.width;
// active is null if the game is currently rendering straight to the window, not to a texture.
एक गैर-प्रारंभिक सरणी के एक तत्व तक पहुंचना
private GameObject[] myObjects ; // Uninitialized array
private void Start()
{
for( int i = 0 ; i < myObjects.Length ; ++i )
Debug.Log( myObjects[i].name ) ;
}
यदि आप इसे C # डेलीगेट्स के बारे में नहीं जानते हैं तो कम आम है, लेकिन गुस्सा करना:
delegate double MathAction(double num);
// Regular method that matches signature:
static double Double(double input)
{
return input * 2;
}
private void Awake()
{
MathAction ma ;
// Because you haven't "assigned" any method to the delegate,
// you will have a NullReferenceException
ma(1) ;
ma = Double ;
// Here, the delegate "contains" the Double method and
// won't throw an exception
ma(1) ;
}
कैसे ठीक करना है ?
यदि आप पिछले पैराग्राफ को समझ गए हैं, तो आप जानते हैं कि त्रुटि को कैसे ठीक किया जाए: सुनिश्चित करें कि आपका वैरिएबल किसी वर्ग की आवृत्ति (या प्रतिनिधियों के लिए कम से कम एक फ़ंक्शन) इंगित कर रहा है।
कहना आसान है करना मुश्किल? हाँ सचमुच। समस्या से बचने और पहचानने के लिए यहां कुछ सुझाव दिए गए हैं ।
"गंदा" तरीका: कोशिश और पकड़ने की विधि:
Collider collider = gameObject.GetComponent<Collider>();
try
{
collider.enabled = false ;
}
catch (System.NullReferenceException exception) {
Debug.LogError("Oops, there is no collider attached", this) ;
}
"क्लीनर" तरीका (IMHO): चेक
Collider collider = gameObject.GetComponent<Collider>();
if(collider != null)
{
// You can safely manipulate the collider here
collider.enabled = false;
}
else
{
Debug.LogError("Oops, there is no collider attached", this) ;
}
जब आप एक त्रुटि का सामना कर रहे हैं, तो आप हमेशा समस्या का कारण ढूंढ सकते हैं। यदि आप "आलसी" हैं (या यदि समस्या को आसानी से हल किया जा सकता है), Debug.Log
तो कंसोल जानकारी पर दिखाने के लिए उपयोग करें जो आपको यह पहचानने में मदद करेगा कि समस्या क्या हो सकती है। एक और अधिक जटिल तरीका यह है कि आप अपने आईडीई के ब्रेकपॉइंट और डीबगर का उपयोग करें।
Debug.Log
किस फ़ंक्शन को उदाहरण के लिए पहले कहा जाता है, यह निर्धारित करने के लिए उपयोग करना काफी उपयोगी है। खासकर यदि आपके पास खेतों को प्रारंभिक करने के लिए एक फ़ंक्शन जिम्मेदार है। लेकिन Debug.Log
अपने कंसोल (और प्रदर्शन कारणों से) को अव्यवस्थित करने से बचने के लिए उन्हें हटाना न भूलें ।
एक और सलाह, अपने फ़ंक्शन को "कट" करने में संकोच न करें और Debug.Log
कुछ चेक बनाने के लिए जोड़ें ।
के बजाय :
GameObject.Find("MyObject").GetComponent<MySuperComponent>().value = "foo" ;
यह देखने के लिए करें कि क्या हर संदर्भ सेट है:
GameObject myObject = GameObject.Find("MyObject") ;
Debug.Log( myObject ) ;
MySuperComponent superComponent = myObject.GetComponent<MySuperComponent>() ;
Debug.Log( superComponent ) ;
superComponent.value = "foo" ;
और भी बेहतर :
GameObject myObject = GameObject.Find("MyObject") ;
if( myObject != null )
{
MySuperComponent superComponent = myObject.GetComponent<MySuperComponent>() ;
if( superComponent != null )
{
superComponent.value = "foo" ;
}
else
{
Debug.Log("No SuperComponent found onMyObject!");
}
}
else
{
Debug.Log("Can't find MyObject!", this ) ;
}
सूत्रों का कहना है:
- http://answers.unity3d.com/questions/47830/what-is-a-null-reference-exception-in-unity.html
- /programming/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it/218510#218510
- https://support.unity3d.com/hc/en-us/articles/206369473-NullReferenceException
- https://unity3d.com/fr/learn/tutorials/topics/scripting/data-types