2015-08-21 6 views
8

DeadObjectException और NullPointerException के बीच क्या अंतर है? मुझे लगता है कि मैं समझ सकता हूं लेकिन मैं बस यह सुनिश्चित करना चाहता था।DeadObjectException के बीच अंतर और एक NullPointerException


मेरी समझ

एक DeadObjectException होता है जब आप (और स्मृति अभी भी मौजूद है) कुछ के लिए एक संदर्भ बनाने की कोशिश कर रहे हैं, लेकिन क्या कोई इसका पता पकड़े संकेत नहीं हैं, इसलिए वहाँ कोई रास्ता नहीं है उस स्मृति तक पहुंचने के लिए। यह NullPointerException से भिन्न है इस तथ्य में कि स्मृति अभी भी मान्य है, वहां पहुंचने का कोई तरीका नहीं है।


क्या मेरे पास सही विचार है? साइट पर अन्य प्रश्न के आधार पर:

मुझे लगता है कि मेरी दावे सही है, मैं सिर्फ यह सुनिश्चित करना चाहता था।

+0

एक दूरस्थ वस्तु एक वस्तु है जो किसी अन्य प्रक्रिया में किसी ऑब्जेक्ट से जुड़ी होती है। जब आप उस पर विधियों को कॉल करते हैं, तो यह उस अन्य ऑब्जेक्ट के लिए प्रॉक्सी के रूप में कार्य करता है। जब रिमोट ऑब्जेक्ट डिस्कनेक्ट हो जाता है, ऑब्जेक्ट अब तक पहुंच योग्य नहीं होता है। आपके द्वारा धारित उदाहरण अभी भी मौजूद है (इसलिए, एनपीई नहीं), लेकिन यह उस चीज़ को संदर्भित करता है जो अब नहीं है। सिद्धांत रूप में एनपीई जैसा दिखता है, लेकिन यह बहुत अधिक स्तर है (और एंड्रॉइड ओएस में उलझा हुआ है)। एनपीई तब होता है जब आप 'MyObject foo = null करते हैं; foo.something(); 'foo एक objec नहीं है यह एक शून्य संदर्भ है। – njzk2

+0

तो (इसे आसानी से रखने के लिए) मैं एक मध्यस्थ वस्तु को पकड़ता हूं जो वास्तविक वस्तु पर रखता है। जब मध्यस्थ अपना संदर्भ खो देता है, तो जब मुझे डीओई मिलता है, क्योंकि वह नहीं जानता कि आदेशों को निष्पादित करना क्या है? – Jeeter

+0

@ njzk2 आपकी टिप्पणी की मेरी व्याख्या सही है? – Jeeter

उत्तर

-2

एक दूरस्थ वस्तु (जैसे एक IBinder) एक वस्तु है। यह किसी ऑब्जेक्ट से जुड़ा हुआ है जो किसी अन्य प्रक्रिया में हो सकता है।

जब आप इस पर विधियों को कॉल करते हैं, तो यह उस अन्य ऑब्जेक्ट के लिए प्रॉक्सी के रूप में कार्य करता है। (इसके बजाय आप सीधे तरीके से कॉल करने के बजाय, आप प्रॉक्सी से अपने इरादे को प्रेषित करने और आपके लिए परिणाम पुनर्प्राप्त करने के लिए कहते हैं।)।

जब रिमोट ऑब्जेक्ट डिस्कनेक्ट हो जाता है, प्रॉक्सी अब ऑब्जेक्ट तक नहीं पहुंच सकता है, लेकिन प्रॉक्सी ऑब्जेक्ट अभी भी स्थानीय रूप से मौजूद है।

आपके द्वारा अभी भी मौजूद घटना का उदाहरण मौजूद है (इसलिए, एनपीई नहीं। जब तक आपके पास उदाहरण पर कोई संदर्भ न हो, तब तक यह गायब नहीं हो सकता है। संदर्भ को पकड़ना असंभव है और उदाहरण गायब हो गया है (कुछ वस्तुएं समान व्यवहार की अनुमति दें, जैसे वीक रेफरेंस), ताकि आप कभी भी प्राप्त न करें और एनपीई)।

हालांकि, यह ऐसा कुछ है जो अब नहीं है। सिद्धांत रूप में एनपीई जैसा दिखता है, लेकिन यह बहुत अधिक स्तर है (और एंड्रॉइड ओएस में उलझा हुआ है और जिस तरह से यह इंटर-प्रोसेस संचार को संभालता है)।

एनपीई जब आप

MyObject foo = null; 
foo.something(); 

foo एक वस्तु यह एक अशक्त संदर्भ है नहीं है क्या होता है।

0

NullPointerException - यह तब फेंक दिया जाता है जब कोई प्रोग्राम किसी ऑब्जेक्ट या किसी सरणी के तत्व को एक्सेस करने का प्रयास करता है जब किसी ऑब्जेक्ट या सरणी का कोई उदाहरण नहीं होता है। android.os.DeadObjectException - developer.android.com से: चूंकि यह रिमोटएक्सप्शन बढ़ाता है जिस ऑब्जेक्ट को आप कॉल कर रहे हैं उसकी मृत्यु हो गई है, क्योंकि इसकी होस्टिंग प्रक्रिया अब मौजूद नहीं है।

उदाहरण के लिए: कॉपी किया गया :) यह अच्छी तरह से समझने के लिए इसका अच्छा उदाहरण है।

आपके पास MyActivity और MyService कक्षाएं हैं। आप उनके बीच संवाद करने के लिए हैंडलर/मैसेंजर का उपयोग करते हैं। आप MyActivity में हैंडलर और मैसेंजर बनाते हैं, और उसके बाद इरादे के माध्यम से मैसेंजर के MyService पर बनाए गए इंस्टेंस को भेजें। फिर आप कुछ सामान करते हैं, समय बीतते हैं, और आपकी मायाएक्टिविटी नष्ट हो जाती है, साथ ही इसके हैंडलर और मैसेन्जर के साथ। अब, अगर आप इसे अच्छी तरह से संभाल नहीं पाते हैं, तो माईस सर्विस यह नहीं जान पाएगा कि उसके पास मैसेंजर अब मान्य नहीं है, इसलिए, वह इसके माध्यम से कुछ भेजने की कोशिश करता है, और मृत ऑब्जेक्टएसेप्शन प्राप्त करता है:

/* एक संदेश भेजें यह मैसेंजर हैंडलर।

पैरामीटर: संदेश भेजने के लिए संदेश। आमतौर पर Message.obtain() के माध्यम से पुनर्प्राप्त। फेंकता: RemoteException फेंकता DeadObjectException यदि लक्ष्य हैंडलर अब मौजूद नहीं है */

सार्वजनिक शून्य भेजने (संदेश संदेश) फेंकता RemoteException {...}

1

NullPointerException तब होता है जब कोई संदर्भ किसी भी ऑब्जेक्ट को उसी जावा वर्चुअल मशीन के भीतर इंगित नहीं करता है।

DeadObjectException तब होता है जब आप दूरस्थ ऑब्जेक्ट को कॉल करते हैं जो अब मौजूद नहीं है। यह 2 अलग जेवीएम पर होता है।

संबंधित मुद्दे