Uwaga: w tej odpowiedzi jest używany Android Studio 2.2.2
Uwaga 2: Rozważam, że Twoje urządzenie zostało pomyślnie podłączone.
Pierwszą rzeczą, którą robisz po awarii aplikacji, jest zajrzenie do LogCat, na dole Android Studio znajduje się pasek narzędzi z listą menu:
Kliknij „Android Monitor” (ten, który podkreśliłem na obrazku powyżej.)
Teraz otrzymasz coś takiego:
Zmień „ Verbose
” na „ Error
”. Teraz będą wyświetlane tylko zarejestrowane błędy. Nie martw się teraz wszystkimi tymi błędami (jeśli je masz).
Ok. Teraz zrób to, co zrobiłeś, aby zawiesić aplikację. Po awarii aplikacji przejdź do logcat. Powinieneś znaleźć nowy dziennik awarii, który ma wiele at:x.x.x
: i Caused by: TrumpIsPresidentException
na przykład. Przejdź do tego Caused by:
oświadczenia w logcat.
Oprócz tego Caused By:
powinien istnieć wyjątek. W moim przypadku jest to RuntimeException
a pod nim powinna znajdować się linia zawierająca niebieski link, taki jak:
Jeśli toCaused by:
NIE MA gdzieś pod nim linii z niebieskim tekstem, poszukaj innej, Caused by:
która ma.
Kliknij ten niebieski link . Powinien Cię zabrać tam, gdzie wystąpił problem. W moim przypadku było to spowodowane tym wierszem:
throw new RuntimeException();
Więc teraz wiem, dlaczego się zawiesza. To dlatego, że sam rzucam wyjątek. To był oczywisty błąd .
Powiedzmy jednak, że dostałem kolejny błąd:
java.lang.NullPointerException
Sprawdziłem logcat, kliknąłem niebieski link, który mi dał, i zabrałem mnie tutaj:
mTextView.setText(myString);
Więc teraz chcę debugować. Zgodnie z tym pytaniem StackOverflow NullPointerException mówi, że coś jest null
.
Dowiedzmy się, co jest zerowe . Istnieją dwie możliwości. Albo mTextView
jest zerowy, albo myString
jest zerowy. Aby się dowiedzieć, przed mTextView.setText(mString)
linią dodaję te dwie linie:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Teraz, podobnie jak poprzednio (zmieniliśmy Verose na Error), chcemy zmienić „Error” na „Debug”. Ponieważ logujemy się przez debugowanie. Oto wszystkie metody dziennika:
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
Odkąd użyliśmy Log.d
, sprawdzamy w Debugowaniu. Dlatego zmieniliśmy to na debugowanie.
Powiadomienie Log.d
ma pierwszy parametr, w naszym przypadku „AppDebug”. Kliknij menu „Brak filtrów” w prawym górnym rogu logcat. Wybierz „Edytuj konfigurację filtra”, nadaj nazwę swojemu filtrowi, aw „Log Tag” wpisz „App Debug”. Kliknij OK". Teraz powinieneś zobaczyć dwie linie w logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Teraz wiemy, że mTextView ma wartość NULL.
Obserwuję mój kod, teraz coś zauważam.
Mam private TextView mTextView
zadeklarowane na szczycie mojej klasy. Ale nie definiuję tego.
Zasadniczo zapomniałem zrobić to w mojej funkcji onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
Dlatego TO mTextView
jest zero, ponieważ zapomniałem powiedzieć mojej aplikacji, co to jest. Dodam więc ten wiersz, uruchomię aplikację, a teraz aplikacja nie ulega awarii.