หมายเหตุ:คำตอบนี้ใช้ Android Studio 2.2.2
หมายเหตุ 2: ฉันกำลังพิจารณาว่าอุปกรณ์ของคุณเชื่อมต่อเรียบร้อยแล้ว
สิ่งแรกที่คุณทำเมื่อแอปพลิเคชันของคุณขัดข้องดูใน LogCat ที่ด้านล่างของ Android Studio มีแถบเครื่องมือพร้อมรายการเมนู:
คลิกที่ "Android Monitor" (ภาพที่ฉันขีดเส้นใต้ในภาพด้านบน ^)
ตอนนี้คุณจะได้รับสิ่งนี้:
เปลี่ยน " Verbose
" เป็น " Error
" ตอนนี้จะแสดงข้อผิดพลาดที่บันทึกไว้ให้คุณเท่านั้น ไม่ต้องกังวลเกี่ยวกับข้อผิดพลาดเหล่านี้ (ถ้าคุณได้รับ) ตอนนี้
ตกลง. ตอนนี้ทำสิ่งที่คุณทำผิดพลาดแอพของคุณ หลังจากแอปล่มให้ไปที่ logcat ของคุณ คุณควรพบบันทึกข้อผิดพลาดใหม่ที่มีจำนวนมากat:x.x.x
: และCaused by: TrumpIsPresidentException
เช่น ไปที่Caused by:
คำสั่งนั้นใน logcat ของคุณ
ถัดไปไปที่Caused By:
ควรจะมีข้อยกเว้นที่เกิดขึ้น ในกรณีของฉันมันคือRuntimeException
และภายใต้มันควรจะมีบรรทัดที่มีลิงค์สีน้ำเงินเช่น:
หากCaused by:
ไม่มีเส้นที่มีข้อความสีฟ้าอยู่ข้างใต้ให้ค้นหาอีกอันCaused by:
ที่ทำ
คลิกที่ลิงค์สีน้ำเงินที่ ควรนำคุณไปยังที่ที่เกิดปัญหา ในกรณีของฉันมันเกิดจากสายนี้:
throw new RuntimeException();
ดังนั้นตอนนี้ฉันรู้ว่าทำไมมันล้มเหลว มันเป็นเพราะฉันโยนข้อยกเว้นตัวเอง นี่เป็นข้อผิดพลาดที่เห็นได้ชัด
อย่างไรก็ตามสมมติว่าฉันมีข้อผิดพลาดอื่น:
java.lang.NullPointerException
ฉันตรวจสอบ logcat ของฉันฉันคลิกที่ลิงค์สีน้ำเงินมันให้ฉันและเอาฉันที่นี่:
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
เรากำลังตรวจสอบใน Debug นั่นเป็นเหตุผลที่เราเปลี่ยนเป็น debug
ประกาศLog.d
มีพารามิเตอร์แรกในกรณีของเรา "AppDebug" คลิกที่เมนูแบบเลื่อนลง "ไม่มีตัวกรอง" ที่ด้านบนขวาของ logcat เลือก "แก้ไขการกำหนดค่าตัวกรอง" ตั้งชื่อให้กับตัวกรองของคุณและใน "บันทึกแท็ก" ให้ใส่ "Debug แอป" คลิก "ตกลง" ตอนนี้คุณควรเห็นสองบรรทัดใน 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
เป็นสาเหตุที่เป็นโมฆะเพราะฉันลืมบอกแอพของฉันว่ามันคืออะไร ดังนั้นฉันจึงเพิ่มบรรทัดนั้นรันแอพของฉันและตอนนี้แอพก็ไม่ผิดพลาด