Maalesef Uygulamam durdu. Bunu Nasıl Çözebilirim?
Bir uygulama geliştiriyorum ve her çalıştırdığımda şu mesajı alıyorum:
Maalesef, Uygulamam durdu.
Bunu çözmek için ne yapabilirim?
Bu soru hakkında - açıkça bir yığın izleme nedir ve bunu uygulama hatalarımda hata ayıklamak için nasıl kullanabilirim? , daha fazla ayrıntı olmadan uygulamalarının çöktüğünü belirten birçok soru var. Bu soru, acemi Android programcılarına, sorunlarını kendi başlarına nasıl çözecekleri veya doğru soruları nasıl soracakları konusunda talimat vermeyi amaçlamaktadır.
Yanıtlar
Bu cevap, yığın izlemesini alma sürecini açıklar. Zaten yığın izleme var mı? " Yığın izleme nedir ve bunu uygulama hatalarımda hata ayıklamak için nasıl kullanabilirim? "
Sorun
Bir yakalama RuntimeException
atıldığı için başvurunuz sonlandırıldı .
Bunlardan en yaygın olanı NullPointerException
.
Nasıl çözeceksin?
Bir Android uygulaması (veya bu konuyla ilgili herhangi bir Java uygulaması) her çöktüğünde Stack trace
, konsola (bu durumda, logcat) bir yazılır. Bu yığın izleme, sorununuzu çözmek için çok önemli bilgiler içerir.
Android Studio
Pencerenin alt çubuğunda Logcat
düğmesine tıklayın. Alternatif olarak, alt+ tuşuna da basabilirsiniz 6. Devices
Panelde emülatörünüzün veya cihazınızın seçili olduğundan emin olun . Ardından, kırmızı ile gösterilen yığın izini bulmaya çalışın. Logcat'te oturum açmış birçok şey olabilir, bu yüzden biraz kaydırmanız gerekebilir. Yığın izini bulmanın kolay bir yolu, logcat'i temizlemek (sağdaki geri dönüşüm kutusunu kullanarak) ve uygulamanın tekrar çökmesine izin vermektir.
Yığın izini buldum, şimdi ne olacak?
Yaşasın! Sorununuzu çözmenin yarısına geldiniz.
Yığın izini analiz ederek uygulamanızın tam olarak neyin çökmesine neden olduğunu bulmanız yeterlidir.
" Yığın izleme nedir ve bunu uygulama hatalarımda hata ayıklamak için nasıl kullanabilirim? "
Hala sorunumu çözemiyorum!
Kendinizi Exception
ve nerede oluştuğunu bulduysanız ve hala nasıl düzelteceğinizi çözemiyorsanız, StackOverflow'da soru sormaktan çekinmeyin.
Mümkün olduğunca kısa ve öz olmaya çalışın: yığın izini ve ilgili kodu gönderin (örneğin, atan satıra kadar birkaç satır Exception
).
Sen kullanabilirsiniz Google'ın ADB aracını almak için Logcat file
konuyu analiz etmek.
adb logcat > logcat.txt
logcat.txt
dosyayı açın ve uygulama adınızı arayın. Neden başarısız olduğu, satır numarası, Sınıf adı vb. Hakkında bilgi olmalıdır.
İlk olarak, uygulamanızın hangi noktada kilitlendiğini kontrol edin ( Unfortunately, MyApp has stopped.
). Bunun için kullanabilirsiniz Log.e("TAG", "Message");
, bu satırı kullanarak uygulamanızın logcat oturumunu görebilirsiniz.
Bundan sonra, uygulamanızın hangi noktayı durdurduğunu bulursunuz, kendi tarafınızda çözmesi çok kolaydır.
Sadece log cat'deki hatayı kontrol edin.
Tutulma sırasında günlük kedi seçeneğini alırsınız:
pencere-> görünümü göster-> diğerleri-> Android-> Logcat
Günlük kedi hata içeriyor.
Aksi takdirde, hata ayıklama modunda bir uygulamayı çalıştırarak da hatayı kontrol edebilirsiniz. Önce bundan sonra şunu yaparak kesme noktası ayarlayın:
projeye sağ tıklayın-> hata ayıkla-> Android uygulaması
Not: Bu yanıt Android Studio 2.2.2 kullanıyor
Not 2: Cihazınızın başarıyla bağlandığını düşünüyorum.
Uygulamanız çöktüğünde yaptığınız ilk şey, LogCat'e bakmaktır, Android Studio'nun altında, menülerin bir listesini içeren bir araç çubuğu vardır:
"Android Monitörü" nü tıklayın (Yukarıdaki resimde altı çizdiğim. ^)
Şimdi, şöyle bir şey alacaksın:
" Verbose
" " " "Olarak değiştirin Error
Şimdi size yalnızca kaydedilen hataları gösterecektir. Şimdi tüm bu hatalar için endişelenmeyin (eğer aldıysanız).
Tamam. Şimdi, uygulamanızı kilitlemek için yaptığınız şeyi yapın. Uygulamanız kilitlendikten sonra logcat'inize gidin. Örneğin çok sayıda at:x.x.x
: içeren yeni bir kilitlenme günlüğü bulmalısınız Caused by: TrumpIsPresidentException
. Caused by:
Logcat'inizde bu ifadeye gidin .
Sonraki için o Caused By:
oldu, İstisna olmalıdır. Benim durumumda, bu bir RuntimeException
ve altında mavi bir bağlantı içeren bir çizgi olmalıdır, örneğin:
O takdirdeCaused by:
bunun altında mavi bir metin yerde bir çizgi var ETMEZ, sonra başka bakmak Caused by:
yapar.
O mavi bağlantıya tıklayın . Sizi sorunun meydana geldiği yere götürmelidir. Benim durumumda, bu satırdan kaynaklanıyordu:
throw new RuntimeException();
Şimdi neden çöktüğünü anlıyorum. Çünkü ben istisnayı kendim yapıyorum. Bu bariz bir hataydı .
Ancak diyelim ki başka bir hata aldım:
java.lang.NullPointerException
Logcatimi kontrol ettim, bana verdiği mavi bağlantıya tıkladım ve beni buraya götürdü:
mTextView.setText(myString);
Yani, şimdi hata ayıklamak istiyorum. Göre bu StackOverflow soru , bir NullPointerException şey olduğunu söylüyor null
.
Öyleyse, null null olduğunu bulalım . İki olasılık var. Ya mTextView
null ya myString
da null. Öğrenmek için mTextView.setText(mString)
satırdan önce şu iki satırı ekliyorum:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Şimdi, daha önce yaptığımız gibi (Verose'u Hata olarak değiştirdik), "Hata" yı "Hata Ayıkla" olarak değiştirmek istiyoruz. Hata ayıklayarak günlüğe kaydettiğimiz için. İşte tüm Günlük yöntemleri:
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
Yani, kullandığımızdan beri Log.d
Debug'ı kontrol ediyoruz. Bu yüzden onu hata ayıklamak için değiştirdik.
Bildirim Log.d
, bizim durumumuzda "AppDebug" olan bir birinci parametreye sahiptir. Logcat'in sağ üst köşesindeki "Filtresiz" açılır menüsünü tıklayın. "Filtre Yapılandırmasını Düzenle" yi seçin, filtrenize bir ad verin ve "Günlük Etiketi" alanına "Uygulama Hata Ayıklama" yazın. "Tamam" ı tıklayın. Şimdi, logcat'de iki satır görmelisiniz:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Artık mTextView'ın boş olduğunu biliyoruz.
Kodumu gözlemliyorum, şimdi bir şey fark ediyorum.
Ben var private TextView mTextView
benim sınıfının en üstünde ilan etti. Ama onu tanımlamıyorum.
Temel olarak bunu onCreate () uygulamamda yapmayı unuttum:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Bu yüzden mTextView
uygulamama ne olduğunu söylemeyi unuttum. Bu yüzden bu satırı ekliyorum, uygulamamı çalıştırıyorum ve şimdi uygulama çökmüyor.
Bu açılır pencere, yalnızca kodunuzda uygulamanın yürütülmesini durduran önemli bir istisna aldığınızda gösterilir. Herhangi bir istisna olabilir NullPointerException
, OutOfMemoryException
vb.
Çek en iyi yolu geçer LogCat hala yığın izleme okumak ve uygulamanın nedenini kontrol etmek hızlı yolu olan Android stüdyoda uygulama geliştirme eğer.
Uygulamanız zaten yayındaysa, logcat'i kullanamazsınız . Böylece, Crashlytics
meydana gelen herhangi bir istisnanın hata raporlarını size sağlamak için uygulayabilirsiniz .
Logcat
Mesajınızı kontrol edin ve Manifest
dosyanızı görün. Activity,
Kullanıcı iznini tanımlamak gibi bir şey eksik olmalıdır` vb.
Şu araçlardan herhangi birini kullanabilirsiniz:
adb logcat
adb logcat> logs.txt (hataları açmak ve aramak için düzenleyicileri kullanabilirsiniz.)
eclipse logcat (Tutulmada görünmüyorsa, Windows-> Görünümü Göster-> Diğerleri-> Android-> LogCat'e gidin)
Android Hata Ayıklama İzleyicisi veya Android Cihaz İzleyicisi (komut izleyicisi yazın veya kullanıcı arabirimi aracılığıyla açın)
- Android Studio
Android Debug Monitor'u kullanmanızı öneririm , bu iyi. Çünkü tutulma, çok fazla günlük olduğunda ve adb logcat filtresiyle ve hepsi zor olduğunda askıda kalıyor.
Kontrol etmelisiniz Stack trace
Bu nasıl yapılır?
IDE'nizde LOGCAT formundaki pencereleri kontrol edin
Logcat pencerelerini göremiyorsanız bu yola gidin ve açın
window->show view->others->Android->Logcat
Google-Api kullanıyorsanız bu yola gidin
adb logcat> logcat.txt
Aşağıdaki showToast () yönteminde, deneyebilirsiniz, böylece bağlam veya uygulama bağlamı için başka bir parametre iletmeniz gerekir.
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
Bir Kapatmaya Zorla karşılaştığınızda (uygulama çalışmayı durdurduğunda) temel bir Logcat analizini paylaşmama izin verin.
BELGELER
Günlükleri toplamak / analiz etmek için Android'in temel aracı logcat'tir.
HERE , Android'in logcat hakkındaki sayfasıdır
Android Studio kullanıyorsanız, bu LINK'i de kontrol edebilirsiniz .
Yakalama
Temel olarak, logcat'i aşağıdaki komutla MANUEL OLARAK yakalayabilirsiniz (veya sadece AndroidStudio'da AndroidMonitor penceresini kontrol edebilirsiniz):
adb logcat
Komuta ekleyebileceğiniz, istediğiniz mesajı filtrelemenize ve görüntülemenize yardımcı olacak birçok parametre vardır ... Bu kişiseldir ... Mesaj zaman damgasını almak için her zaman aşağıdaki komutu kullanırım:
adb logcat -v time
Çıkışı bir dosyaya yönlendirebilir ve bir Metin Düzenleyicide analiz edebilirsiniz.
Analiz
Uygulamanız Kilitleniyorsa, aşağıdaki gibi bir şey alırsınız:
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
Günlüğün bu bölümü size birçok bilgi gösterir:
- Sorun ne zaman ortaya çıktı?
07-09 08:29:13.475
Sorunun ne zaman gerçekleştiğini kontrol etmek önemlidir ... Bir günlükte birkaç hata bulabilirsiniz ... doğru mesajları kontrol ettiğinizden emin olmalısınız :)
- Hangi uygulama kilitlendi:
com.example.khan.abc
Bu şekilde, hangi uygulamanın kilitlendiğini bilirsiniz (mesajınızla ilgili günlükleri kontrol ettiğinizden emin olmak için)
- Hangi HATA:
java.lang.NullPointerException
NULL Pointer İstisna hatası
- Hata hakkında ayrıntılı bilgi:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
onBackPressed()
Bir FragmentActivity
nesneden yöntemi çağırmayı denediniz . Ancak, o nesne null
sen yaptığın zamandı.
Yığın İzleme: Yığın İzleme size yöntem çağırma sırasını gösterir ... Bazen hata arama yönteminde olur (ve çağrılan yöntemde değil).
com.example.khan.abc.AudioFragment adresinde $ 1.onClick (AudioFragment.java:125)
Dosyada hata oluştu , satırdaki yöntemin com.example.khan.abc.AudioFragment.java
içinde onClick()
: 125
(yığın izleme, hatanın meydana geldiği satırı gösterir)
Adı:
at android.view.View.performClick(View.java:4848)
Hangi çağırdı:
at android.view.View$PerformClick.run(View.java:20262)
tarafından çağrılan:
at android.os.Handler.handleCallback(Handler.java:815)
vb....
Genel Bakış
Bu sadece bir genel bakıştı ... Tüm günlükler basit değil, ancak hata belirli bir sorun veriyor ve ayrıntılı tüm sorunları gösteriyor ... Sadece fikri paylaşmak ve size giriş seviyesi bilgileri sağlamak için ...
Umarım bir şekilde size yardımcı olabilirim ... Saygılar
LogCat'i kullanın ve uygulamanın çökmesine neden olan şeyi bulmaya çalışın.
Android Studio kullanıyorsanız Logcat'i görmek için ALT + 6'ya basın veya
Eğer kullanırsanız Eclipse sonra Window -> Aç Perspektif -> Diğer - LogCat
LogCat'e gidin, açılır menüden hata seçin. Bu, hata ayıklamanıza yardımcı olacak tüm gerekli bilgileri içerecektir. Bu işe yaramazsa, LogCat'i sorunuza bir düzenleme olarak gönderin, biri size yardımcı olacaktır.
Uygulamanız herhangi bir nedenle iyi bir yığın izleme olmadan çökerse. İlk satırdan hata ayıklamayı deneyin ve çökene kadar satır satır gidin. O zaman cevabınız olacak, hangi satır size sorun çıkarıyor. Muhtemelen daha sonra bunu deneme bloğu ve yazdırma hatası çıktısına sarabilirsiniz.
Bu hata mesajını, herhangi bir yığın izleme veya başka bir hata mesajı olmaksızın kendi başına da alabilirsiniz.
Bu durumda, Android bildiriminizin doğru şekilde yapılandırıldığından emin olmanız gerekir (bir kitaplıktan gerçekleşen tüm bildirimler ve bir kitaplıktan gelen etkinlikler dahil) ve bildirim dosyalarınızda uygulamanızda görüntülenen ilk etkinliğe özellikle dikkat edin. .
Geliştirme sırasında çökme
Benim favori aracı deneyin LogView günlükleri almak ve gelişme sırasında bunları analiz etmek.
Emin işaretine olun ./logview
ve ./lib/logview.jar
Linux çalıştırırken yürütülebilir olarak.
Beğenmediyseniz, Android için birçok alternatif masaüstü günlük görüntüleyici var .
Vahşi doğada kaza
Kullanıcıların cihazlarında meydana gelen işlenmemiş istisnaların yığın izlerini almak için Firebase Crashlytics gibi gerçek zamanlı bir kilitlenme raporlama aracı entegre edin .
Sahadaki hataların nasıl ele alınacağı hakkında daha fazla bilgi edinmek için Bir Buggy Uygulaması Nasıl Yayınlanır (Ve Hikayeyi Anlatmak İçin Canlı) adlı makaleyi okuyun .
İnsanlar hata yapar ve bu nedenle kodlama da yapar.
Ne zaman error
olursa olsun, her zaman kırmızı renkli metinle logcat ile kontrol edin, ancak asıl sorunu mavi renkli metinde, kırmızı renkli metinde altı çizili olarak bulabilirsiniz.
U yeni oluştur emin olun activity
her zaman, beyan activity
içinde AndroidManifest
dosyanın.
İzin ekliyorsanız, bunu AndroidMainifest
dosyada da bildirin.
Logcat - Android Studio'nun geliştirme aşamasındaki günlükleri kontrol etmek için
Başlangıçta Logcat'i temizleyin ve uygulamanın tekrar çökmesine izin verin, böylece yalnızca kilitlenen günlük ayrıntılarını alabilirsiniz. Yığın izini kontrol etmelisiniz
Maalesef, Uygulamam durdu. Bunun birçok nedeni var. Aynı günlükleri de kontrol edebilirsiniz. Bunun için Log.e ("ETİKET", "Mesaj");
Aşağıdakiler gibi uygulama çökmesi sırasında yaygın hata:
- Kodlama hatası (Anahtar kelimelerin yanlış kullanımı).
- Eşleşmeyen özellik adı.
- Desteklenmeyen eklenti (belki).
- Uyumsuz sürüm (belki).
- AndroidManifest dosyasında etkinlik eksik.
- AndroidManifest dosyasında izin eksik.
- En yaygın NullPointerException.
- Bildirildi ancak tanımlanmadı.
Uygulama kilitlenme hatasını çözmek için:
- Yukarıdaki noktaları aklınızda bulundurun ve üzerinden geçin.
- Hata ile, dosya adını da mavi renkte alacaksınız (üzerlerine tıklayın ve hatadan koda atlayın).
Öncelikle, uygulamanızın nerede ve neden çöktüğünü kontrol etmeniz gerekir. (Unfortunately, MyApp has stopped.).
Yardımıyla, LOG
neyin yanlış gittiğini anlayabilirsiniz.
Bundan sonra, uygulamanızın sizin açınızdan düzeltmeyi hangi noktada durdurduğunu bulursunuz.
Terminalinizde herhangi bir ilginç günlüğünüz yoksa (veya bunlar doğrudan uygulamanızla ilgili değilse), sorununuz yerel bir kitaplıktan kaynaklanıyor olabilir. Bu durumda, terminalinizdeki "mezar taşı" dosyalarını kontrol etmelisiniz.
Kaldırıldı olarak işaretlenen dosyaların varsayılan konumu her aygıta bağlıdır, ancak bu durumda, şunları söyleyen bir günlüğünüz olacaktır: Tombstone written to: /data/tombstones/tombstone_06
Daha fazla bilgi için https://source.android.com/devices/tech/debug adresini kontrol edin .
Ayrıca bu komutu terminalde çalıştırmak sorunu bulmanıza yardımcı olabilir:
gradlew build > log.txt 2>details.txt
daha sonra yukarıdaki iki günlük dosyasında gradlew dosya konumuna gitmelisiniz.