नोट: यह उत्तर एंड्रॉइड स्टूडियो 2.2.2 का उपयोग कर रहा है
नोट 2: मैं विचार कर रहा हूं कि आपका उपकरण सफलतापूर्वक जुड़ा हुआ है।
जब आपका एप्लिकेशन क्रैश हो जाता है, तो सबसे पहली बात आप LogCat में देखते हैं, Android Studio के निचले भाग में एक टूलबार है जिसमें सूची का एक संस्करण है:
"एंड्रॉइड मॉनिटर" पर क्लिक करें (ऊपर मैंने जो चित्र में रेखांकित किया है। ^)
अब, आपको कुछ इस तरह मिलेगा:
"" Verbose
"को बदलें" Error
अब यह केवल आपको लॉग की गई त्रुटियों को दिखाएगा। इन सभी त्रुटियों के बारे में चिंता न करें (यदि आप उन्हें मिल गए हैं)।
ठीक है। अब, आपने अपने ऐप को क्रैश करने के लिए क्या किया। आपका ऐप क्रैश होने के बाद, अपने लॉगकैट पर जाएं। आपको एक नया क्रैश लॉग ढूंढना चाहिए जिसमें बहुत कुछ है at:x.x.x
: और Caused by: TrumpIsPresidentException
उदाहरण के लिए। Caused by:
अपने logcat में उस स्टेटमेंट पर जाएं ।
के बगल में है कि Caused By:
, वहाँ अपवाद कि क्या हुआ होना चाहिए। मेरे मामले में, यह एक है RuntimeException
और इसके तहत एक पंक्ति होनी चाहिए जिसमें एक नीली कड़ी शामिल है जैसे:
अगर उसCaused by:
DOESN'T के नीचे कहीं एक नीले रंग की टेक्स्ट के साथ एक पंक्ति है, तो दूसरे के लिए देखो Caused by:
जो करता है।
उस नीले लिंक पर क्लिक करें । यह आपको उस स्थान पर ले जाना चाहिए जहाँ समस्या हुई थी। मेरे मामले में, यह इस लाइन के कारण था:
throw new RuntimeException();
तो, अब मुझे पता है कि यह दुर्घटनाग्रस्त क्यों है। ऐसा इसलिए है क्योंकि मैं खुद अपवाद को फेंक रहा हूं। यह एक स्पष्ट त्रुटि थी ।
हालाँकि, मान लें कि मुझे एक और त्रुटि मिली:
java.lang.NullPointerException
मैंने अपना लॉगिन चेक किया, मैंने उस नीले लिंक पर क्लिक किया जो उसने मुझे दिया था, और यह मुझे यहाँ ले गया:
mTextView.setText(myString);
इसलिए, अब मैं डिबग करना चाहता हूं। इस StackOverflow प्रश्न के अनुसार , एक NullPointerException कहता है कि कुछ है null
।
तो, आइए जानें कि क्या अशक्त है । दो संभावनाएं हैं। या तो mTextView
अशक्त है, या myString
अशक्त है। पता करने के लिए, mTextView.setText(mString)
लाइन से पहले , मैं इन दो लाइनों को जोड़ता हूं:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
अब, जैसे हमने पहले किया था (हमने Verose को Error में बदल दिया है), हम "Error" को "Debug" में बदलना चाहते हैं। चूंकि हम डिबगिंग द्वारा लॉगिंग कर रहे हैं। यहाँ सभी लॉग तरीके हैं:
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
इसलिए, जब से हमने उपयोग किया Log.d
, हम डिबग में जाँच कर रहे हैं। इसलिए हमने इसे डिबग में बदल दिया।
नोटिस Log.d
का पहला पैरामीटर है, हमारे मामले में "AppDebug"। लॉगकैट के शीर्ष-दाईं ओर "नो फिल्टर" ड्रॉप डाउन मेनू पर क्लिक करें। "फ़िल्टर कॉन्फ़िगरेशन संपादित करें" चुनें, अपने फ़िल्टर को एक नाम दें, और "लॉग टैग" में "ऐप डीबग" डालें। ओके पर क्लिक करें"। अब, आपको logcat में दो लाइनें देखनी चाहिए:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
तो अब हम जानते हैं कि mTextView शून्य है।
मैं अपने कोड का निरीक्षण करता हूं, अब मैं कुछ नोटिस करता हूं।
मैंने private TextView mTextView
अपनी कक्षा में सबसे ऊपर घोषित किया है। लेकिन, मैं इसे परिभाषित नहीं कर रहा हूं।
मूल रूप से मैं अपने onCreate में यह करना भूल गया ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
इसलिए mTextView
, यह अशक्त क्यों है, क्योंकि मैं अपना ऐप बताना भूल गया हूं कि यह क्या है। इसलिए मैं उस लाइन को जोड़ता हूं, अपना ऐप चलाता हूं, और अब ऐप क्रैश नहीं होता है।