Catatan: Jawaban ini menggunakan Android Studio 2.2.2
Catatan 2: Saya mempertimbangkan bahwa perangkat Anda berhasil terhubung.
Hal pertama yang Anda lakukan ketika aplikasi Anda mogok adalah melihat ke dalam LogCat, di bagian bawah Android Studio ada bilah alat dengan daftar menu:
Klik pada "Android Monitor" (Yang saya garis bawahi pada gambar di atas. ^)
Sekarang, Anda akan mendapatkan sesuatu seperti ini:
Ubah " Verbose
" menjadi " Error
" Sekarang hanya akan menunjukkan kepada Anda kesalahan yang dicatat. Jangan khawatir tentang semua kesalahan ini (jika Anda mendapatkannya) sekarang.
Baik. Sekarang, lakukan apa yang Anda lakukan untuk merusak aplikasi Anda. Setelah aplikasi Anda mogok, buka logcat Anda. Anda harus menemukan crash log baru yang memiliki banyak at:x.x.x
: dan Caused by: TrumpIsPresidentException
misalnya. Buka Caused by:
pernyataan itu di logcat Anda.
Selain itu Caused By:
, harus ada Pengecualian yang terjadi. Dalam kasus saya, ini adalah RuntimeException
dan di bawahnya harus ada garis yang berisi tautan biru seperti:
Jika ituCaused by:
TIDAK memiliki garis dengan teks biru di suatu tempat di bawahnya, maka cari yang lain Caused by:
.
Klik tautan biru itu . Ini akan membawa Anda ke tempat masalah terjadi. Dalam kasus saya, itu karena baris ini:
throw new RuntimeException();
Jadi, sekarang saya tahu mengapa itu menabrak. Itu karena aku melempar pengecualian sendiri. Ini adalah kesalahan yang jelas .
Namun, katakanlah saya mendapat kesalahan lain:
java.lang.NullPointerException
Saya memeriksa logcat saya, saya mengklik tautan biru yang diberikannya kepada saya, dan itu membawa saya ke sini:
mTextView.setText(myString);
Jadi, sekarang saya ingin men-debug. Menurut pertanyaan StackOverflow ini , NullPointerException mengatakan bahwa ada sesuatu null
.
Jadi, mari kita cari tahu apa itu null . Ada dua kemungkinan. Baik mTextView
itu nol, atau myString
nol. Untuk mengetahuinya, sebelum mTextView.setText(mString)
baris, saya menambahkan dua baris ini:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Sekarang, seperti yang kami lakukan sebelumnya (Kami mengubah Verose ke Error), kami ingin mengubah "Error" menjadi "Debug". Karena kita masuk dengan men-debug. Inilah semua metode Log:
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
Jadi, karena kami menggunakan Log.d
, kami memeriksa di Debug. Itu sebabnya kami mengubahnya menjadi debug.
Pemberitahuan Log.d
memiliki parameter pertama, dalam kasus kami "AppDebug". Klik menu tarik-turun "No Filters" di kanan atas logcat. Pilih "Edit Konfigurasi Filter", berikan nama pada filter Anda, dan di "Log Tag" masukkan "App Debug". Klik "OK". Sekarang, Anda akan melihat dua baris di logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Jadi sekarang kita tahu bahwa mTextView adalah nol.
Saya mengamati kode saya, sekarang saya perhatikan sesuatu.
Saya telah private TextView mTextView
menyatakan di bagian atas kelas saya. Tapi, saya tidak mendefinisikannya.
Pada dasarnya saya lupa melakukan ini di onCreate () saya:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Jadi ITULAH mTextView
itu batal, karena saya lupa memberi tahu aplikasi saya apa itu. Jadi saya tambahkan baris itu, jalankan aplikasi saya, dan sekarang aplikasi tidak macet.