Nota: Esta resposta está usando o Android Studio 2.2.2
Nota 2: Estou considerando que seu dispositivo foi conectado com sucesso.
A primeira coisa que você faz quando seu aplicativo trava é procurar o LogCat, na parte inferior do Android Studio há uma barra de ferramentas com uma lista de menus:
Clique no "Android Monitor" (o que sublinhei na imagem acima. ^)
Agora, você terá algo parecido com isto:
Altere " Verbose
" para " Error
" Agora, ele mostrará apenas erros registrados. Não se preocupe com todos esses erros (se você os tiver) agora.
Está bem. Agora, faça o que você fez para travar seu aplicativo. Depois que o aplicativo falhar, vá para o seu logcat. Você deve encontrar um novo log de falha que possui muito at:x.x.x
: e Caused by: TrumpIsPresidentException
por exemplo. Vá para essa Caused by:
instrução no seu logcat.
Além disso Caused By:
, deve haver a exceção que aconteceu. No meu caso, é um RuntimeException
e abaixo dele deve haver uma linha que contém um link azul como:
Se issoCaused by:
NÃO tiver uma linha com um texto azul em algum lugar, procure outra Caused by:
que tenha.
Clique no link azul . Deve levá-lo para onde o problema ocorreu. No meu caso, foi devido a esta linha:
throw new RuntimeException();
Então, agora eu sei por que está falhando. É porque eu mesma estou lançando a exceção. Este foi um erro óbvio .
No entanto, digamos que recebi outro erro:
java.lang.NullPointerException
Eu verifiquei meu logcat, cliquei no link azul que ele me dava e me levou aqui:
mTextView.setText(myString);
Então, agora eu quero depurar. De acordo com esta pergunta StackOverflow , um NullPointerException diz que algo é null
.
Então, vamos descobrir o que é nulo . Existem duas possibilidades. Ou mTextView
é nulo ou myString
é nulo. Para descobrir, antes da mTextView.setText(mString)
linha, adiciono estas duas linhas:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Agora, como fizemos anteriormente (alteramos Verose para erro), queremos alterar "Erro" para "Depuração". Como estamos registrando por depuração. Aqui estão todos os métodos de 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
Então, desde que usamos Log.d
, estamos verificando o Debug. Foi por isso que a alteramos para depuração.
O aviso Log.d
tem um primeiro parâmetro, no nosso caso "AppDebug". Clique no menu suspenso "Sem filtros" no canto superior direito do logcat. Selecione "Editar configuração do filtro", atribua um nome ao seu filtro e, em "Tag de log", coloque "App Debug". Clique OK". Agora, você deve ver duas linhas no logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Então agora sabemos que o mTextView é nulo.
Eu observo meu código, agora percebo algo.
eu tenho private TextView mTextView
declarei no topo da minha classe. Mas não estou definindo isso.
Basicamente, eu esqueci de fazer isso no meu onCreate ():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
É por isso que mTextView
é nulo, porque eu esqueci de dizer ao meu aplicativo o que é. Então, adiciono essa linha, executo meu aplicativo e agora o aplicativo não falha.