ActionScript 3
"त्रुटि 1009 को समझना: एक अशक्त वस्तु संदर्भ की संपत्ति या विधि का उपयोग नहीं कर सकता"
खोज…
परिचय
null
मान प्राप्त करने का प्रयास कर रहे होते हैं। प्रदान किए गए उदाहरण विभिन्न मामलों को उजागर करते हैं जहां यह त्रुटि उत्पन्न होती है, साथ में कुछ सिफारिशों के साथ त्रुटि को कम कैसे करें।
टिप्पणियों
घबराए हुए और अक्सर पूछे जाने वाले "त्रुटि 1009: एक अशक्त वस्तु संदर्भ की संपत्ति या विधि का उपयोग नहीं कर सकता है" एक संकेत है कि कुछ डेटा शून्य दिखाई देता है, लेकिन इसे एक आबादी वाली वस्तु के रूप में उपयोग करने की कोशिश की जाती है। बहुत सारे प्रकार के मुद्दे हैं जो इस व्यवहार का कारण बन सकते हैं, और प्रत्येक को उस कोड के खिलाफ परीक्षण किया जाना चाहिए जहां त्रुटि उत्पन्न हुई।
स्टेज अनुपलब्ध है
कभी-कभी डेवलपर्स कुछ कोड लिखते हैं जो श्रोताओं को जोड़ने के लिए stage
, या फ्लैश चरण तक पहुंच की इच्छा रखते हैं। यह पहली बार काम कर सकता है, फिर सभी अचानक काम करने में विफल हो जाते हैं और त्रुटि 1009 उत्पन्न करते हैं। प्रश्न में कोड समयावधि पर भी हो सकता है, क्योंकि यह कोड जोड़ने की पहली पहल है, और कई ट्यूटोरियल जो अभी भी मौजूद हैं। कोड रखने के लिए टाइमलाइन कोड लेयर।
public class Main extends MovieClip {
public function Main() {
stage.addEventListener(Event.ENTER_FRAME,update); // here
इस कोड के काम न करने का कारण सरल है: एक डिस्प्ले ऑब्जेक्ट को पहले तत्काल किया जाता है, फिर प्रदर्शन सूची में जोड़ा जाता है, और जब यह प्रदर्शन सूची से बाहर होता है, तो stage
शून्य होता है।
इससे भी बदतर अगर कोड इस तरह:
stage.addEventListener(Event.ENTER_FRAME,update); // here
समयरेखा पर रखा गया है। यह कुछ समय के लिए भी काम कर सकता है, जबकि Main
ऑब्जेक्ट को जीयूआई के माध्यम से मंच पर थप्पड़ मारा जाता है। फिर, उनका SWF दूसरे SWF से लोड होता है, और अचानक कोड टूट जाता है। ऐसा इसलिए होता है क्योंकि SWF को खिलाड़ी द्वारा सीधे लोड किए जाने पर और जब लोडिंग को अतुल्यकालिक रूप से संसाधित किया जाता है, तो Main
फ्रेम का निर्माण एक अलग तरीके से किया जाता है। समाधान Event.ADDED_TO_STAGE
श्रोता का उपयोग Event.ADDED_TO_STAGE
है, और इसमें सभी चरणों को संबोधित करने वाले कोड को डाल दिया है, और समयरेखा के बजाय श्रोता को एएस फ़ाइल में डाल दिया है।
अवैध टाइपकास्ट
function listener(e:Event):void {
var m:MovieClip=e.target as MovieClip;
m.x++;
}
यदि ऐसा श्रोता किसी ऑब्जेक्ट से जुड़ा हुआ है जो कि MovieClip
वंशज नहीं है (उदाहरण के लिए, Sprite
), तो टाइपकास्ट विफल हो जाएगा, और इसके परिणाम के साथ कोई भी बाद का संचालन 1009 त्रुटि को फेंक देगा।
अविरत वस्तु
var a:Object;
trace(a); // null
trace(a.b); // Error 1009
यहां, एक ऑब्जेक्ट संदर्भ घोषित किया गया है, लेकिन इसे कभी भी एक मान नहीं सौंपा गया है, यह एक गैर-शून्य मान के new
या असाइनमेंट के साथ हो। इसके गुणों या विधि का अनुरोध करने पर 1009 त्रुटि होती है।
बहु-स्तरीय अभिव्यक्ति
x=anObject.aProperty.anotherProperty.getSomething().data;
यहां, डॉट से पहले कोई भी वस्तु शून्य हो सकती है, और जटिल वस्तुओं को वापस करने वाले तरीकों का उपयोग करके केवल शून्य त्रुटि को डीबग करने के लिए जटिलता बढ़ जाती है। सबसे खराब स्थिति अगर पद्धति में बाहरी विफलताओं का खतरा है, तो नेटवर्क पर डेटा पुनर्प्राप्त करना कहें।
अनप्रोसेस्ड फंक्शन रिजल्ट
s=this.getChildByName("garbage");
if (s.parent==this) {...}
getChildByName()
उन कई कार्यों में से एक है जो अपने इनपुट को संसाधित करते समय त्रुटि होने पर अशक्त लौट सकते हैं। इसलिए, यदि आप किसी भी फ़ंक्शन से एक ऑब्जेक्ट प्राप्त कर रहे हैं जो संभवतः अशक्त लौट सकता है, तो पहले अशक्त के लिए जांचें। यहां, किसी संपत्ति को पहले जाँच के बिना तुरंत जांचा जाता है यदि s
शून्य है, तो यह 1009 त्रुटि उत्पन्न करेगा।
भूल गए श्रोता
addEventListener(Event.ENTER_FRAME,moveChild);
function moveChild(e:Event):void {
childMC.x++;
if (childMC.x>1000) {
gotoAndStop(2);
}
}
यह उदाहरण childMC
को स्थानांतरित करेगा (डिजाइन समय में Main
में जोड़ा गया) लेकिन तुरंत ही 1009 को फेंक देगा जैसे ही gotoAndStop()
को आमंत्रित किया जाता है, अगर वह childMC
फ्रेम पर मौजूद नहीं है 2. इसका प्राथमिक कारण यह है कि जब भी कोई प्लेहेड गुजरता है एक कुंजी फ्रेम (एक फ्रेम जो पिछले फ्रेम के ऑब्जेक्ट सेट को इनहेरिट नहीं करता है), या तो gotoAndStop()
, gotoAndStop()
का उपयोग करके डेस्टिनेशन फ्रेम को gotoAndPlay()
द्वारा करंट फ्रेम से अलग किया जा रहा है, या सामान्य प्ले द्वारा यदि SWF है तो एनिमेशन, वर्तमान फ़्रेम की सामग्री नष्ट हो गई है और GUI से संग्रहीत डेटा का उपयोग करके नई सामग्री बनाई गई है। इसलिए, यदि नए फ्रेम में childMC
नाम का बच्चा नहीं है, तो संपत्ति अनुरोध शून्य हो जाएगा और 1009 को फेंक दिया जाएगा।
यदि आप दो ईवेंट श्रोताओं को जोड़ते हैं, तो एक ही सिद्धांत लागू होता है, लेकिन केवल एक को हटाएं, या किसी श्रोता को एक ऑब्जेक्ट में जोड़ें, लेकिन दूसरे से हटाने का प्रयास करें। यदि ऑब्जेक्ट का कोई संबंधित ईवेंट श्रोता संलग्न नहीं है, तो removeEventListener
कॉल आपको चेतावनी नहीं देगा, इसलिए इवेंट श्रोताओं को जोड़ने और removeEventListener
वाले कोड को ध्यान से पढ़ें।
ध्यान दें: Timer
ऑब्जेक्ट्स का उपयोग करके, कॉलिंग setInterval()
और setTimeout()
भी ईवेंट श्रोताओं को बनाता है, और इन्हें भी ठीक से साफ़ किया जाना चाहिए।
फ़्रेम-आधारित ऑब्जेक्ट का अमान्य संदर्भ
कभी-कभी gotoAndStop()
कोड के बीच में कहा जाता है जो कुछ फ्रेम-आधारित गुणों को संदर्भित करता है। लेकिन, फ़्रेम के ठीक बाद में वर्तमान फ़्रेम पर मौजूद गुणों के सभी लिंक अमान्य हो जाते हैं, इसलिए उन्हें शामिल करने वाले किसी भी प्रसंस्करण को तुरंत समाप्त कर दिया जाना चाहिए।
इस तरह के प्रसंस्करण के दो सामान्य परिदृश्य होते हैं: पहला, एक लूप समाप्त नहीं होता है जैसे कि gotoAndStop()
कॉल, यहां:
for each (bullet in bullets) {
if (player.hitTestObject(bullet)) gotoAndStop("gameOver");
}
यहां, 1009 त्रुटि का मतलब है कि gotoAndStop()
कॉल को संसाधित करते समय player
MC नष्ट हो गया था, लेकिन लूप जारी है, और hitTestObject()
से प्राप्त करने के लिए अब-नल लिंक को संदर्भित करता है। यदि स्थिति यह कहेगी कि if (bullet.hitTestObject(player))
इसके बजाय, त्रुटि # 2007 होगी "पैरामीटर हिटटेस्टऑबजेक्ट को शून्य नहीं होना चाहिए"। समाधान gotoAndStop()
कॉल करने के ठीक बाद एक return
स्टेटमेंट डालना है।
दूसरा मामला एक ही घटना पर कई इवेंट श्रोताओं है। ऐशे ही:
stage.addEventListener(Event.ENTER_FRAME,func1);
stage.addEventListener(Event.ENTER_FRAME,func2);
function func1(e:Event):void {
if (condition()) {
gotoAndStop(2);
}
}
यहां, यदि condition()
सत्य है, तो पहला श्रोता gotoAndStop()
प्रदर्शन करेगा, लेकिन दूसरा श्रोता अभी भी निष्पादित किया जाएगा, और यदि वह फ्रेम पर वस्तुओं को संदर्भित करता है, तो 1009 त्रुटि डाली जाएगी। एक ही घटना पर एक ही घटना में कई श्रोताओं से बचने के लिए समाधान है, एक श्रोता होना बेहतर है जो उस घटना पर सभी स्थितियों को संभालता है और फ्रेम परिवर्तन की आवश्यकता होने पर ठीक से समाप्त कर सकता है।