মান টাইপ বনাম রেফারেন্স প্রকার
অনেক প্রোগ্রামিং ভাষায়, ভেরিয়েবলগুলিকে "ডেটা টাইপ" বলা হয়। দুটি প্রাথমিক তথ্য প্রকারের মান হ'ল মান প্রকার (ইনট, ফ্লোট, বুল, চর, স্ট্রাক্ট, ...) এবং রেফারেন্স টাইপ (ক্লাসের উদাহরণ)। মান ধরণের মানগুলি নিজেই থাকে তবে রেফারেন্সগুলিতে মানগুলির একটি সেট (সি / সি ++ এর সমান) অন্তর্ভুক্ত করার জন্য বরাদ্দকৃত মেমরির একটি অংশকে নির্দেশ করে একটি মেমরি ঠিকানা থাকে।
উদাহরণস্বরূপ, Vector3
একটি মান ধরণের (স্থানাঙ্ক এবং কিছু ফাংশন সমন্বিত একটি কাঠামো) যখন আপনার গেমওজেক্টের সাথে সংযুক্ত উপাদানগুলি (আপনার কাস্টম স্ক্রিপ্টগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় MonoBehaviour
) উল্লেখযোগ্য প্রকার।
আমি কখন নুলরেফারেন্সেপশন করতে পারি?
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();
}
গেমওজেক্টের সাথে সংযুক্ত না থাকা কোনও উপাদান পুনরুদ্ধার করা এবং তারপরে, এটি চালনার চেষ্টা করা:
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 ) ;
}
কম সাধারণ, তবে আপনি যদি সি # প্রতিনিধিদের সম্পর্কে এটি না জানেন তবে বিরক্ত হয়:
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) ;
}
"ক্লিনার" উপায় (আইএমএইচও): চেক
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
উদাহরণস্বরূপ কোন ফাংশনটি প্রথমে বলা হয় তা নির্ধারণ করতে ব্যবহার করা বেশ কার্যকর। ক্ষেত্রগুলি আরম্ভ করার জন্য যদি আপনার কোনও কার্যক্রমে দায়বদ্ধ থাকে Especially তবে 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