Infelizmente, o MyApp parou. Como posso resolver isso?

787

Estou desenvolvendo um aplicativo e, sempre que o executo, recebo a mensagem:

Infelizmente, o MyApp parou.

O que posso fazer para resolver isso?


Sobre esta pergunta - obviamente inspirada em O que é um rastreamento de pilha e como posso usá-lo para depurar os erros de meu aplicativo? , há muitas perguntas informando que o aplicativo falhou, sem mais detalhes. Esta pergunta tem como objetivo instruir os programadores iniciantes do Android sobre como tentar resolver seus próprios problemas ou fazer as perguntas certas.

nhaarman
fonte
22
Eu já vi muitas perguntas sendo encerradas por isso. Essa é uma boa referência para ajudar as pessoas a postar dados relevantes em suas perguntas. No entanto, isso não é uma duplicata de nenhum problema raiz lá, mas apenas uma metodologia para descobrir o problema raiz. Eu acho que seria melhor apenas fornecer o link para esta pergunta como referência e não fechar como duplicado.
Laalto 18/05
33
Eu acho que a função fechar é perfeita para isso. A maioria dessas perguntas mostra pouco conhecimento das habilidades básicas de depuração. Colocá-los em espera fornece uma chance para eles esclarecerem seus problemas, usando o método descrito na resposta. Melhor ainda, eles podem resolver o problema eles mesmos. Essa discussão pode ser mais adequada para o meta.stackoverflow.com.
Nhaarman 19/05
Esta pergunta é muito vaga. Uma pergunta melhor seria 'usando [myIDE] como depurar' um aplicativo Android que está exibindo o erro 'Infelizmente, o MyApp parou' '
Chris Halcrow
7
@ChrisHalcrow Esta Q / A não é sobre depuração. Trata-se de orientar iniciantes no Android como lidar com falhas de aplicativos.
Nhaarman 30/10/2015
stackoverflow.com/questions/26609734/… .. habilite o erro multidex becoz ao converter para apk
RejoylinLokeshwaran

Respostas:

719

Esta resposta descreve o processo de recuperação do rastreamento de pilha. Já tem o rastreamento de pilha? Leia os rastreamentos de pilha em " O que é um rastreamento de pilha e como posso usá-lo para depurar os erros do meu aplicativo? "

O problema

Seu aplicativo foi encerrado porque um não capturado RuntimeExceptionfoi lançado.
O mais comum deles é o NullPointerException.

Como resolver isso?

Sempre que um aplicativo Android falha (ou qualquer aplicativo Java), a Stack traceé gravado no console (neste caso, logcat). Esse rastreamento de pilha contém informações vitais para resolver seu problema.

Android Studio

Localizando o rastreamento de pilha no Android Studio

Na barra inferior da janela, clique no Logcatbotão Como alternativa, você pode pressionar alt+ 6. Verifique se o seu emulador ou dispositivo está selecionado no Devicespainel. Em seguida, tente encontrar o rastreamento de pilha, mostrado em vermelho. Pode haver muitas coisas registradas no logcat, portanto, você pode precisar rolar um pouco. Uma maneira fácil de encontrar o rastreamento de pilha é limpar o logcat (usando a lixeira à direita) e deixar o aplicativo travar novamente.

Eu encontrei o rastreamento de pilha, e agora?

Yay! Você está no meio do caminho para resolver seu problema.
Você só precisa descobrir o que exatamente fez o seu aplicativo travar, analisando o rastreamento da pilha.

Leia os rastreamentos de pilha em " O que é um rastreamento de pilha e como posso usá-lo para depurar os erros de meu aplicativo? "

Ainda não consigo resolver meu problema!

Se você encontrou sua Exceptione a linha onde ocorreu, e ainda não consegue descobrir como corrigi-la, não hesite em fazer uma pergunta no StackOverflow.

Tente ser o mais conciso possível: publique o rastreamento da pilha e o código relevante (por exemplo, algumas linhas até a linha que lançou o Exception).

nhaarman
fonte
33
Sei que este post é antigo: mas se você usar o IntelliJ IDEA, poderá entrar Android > Devices|Logcate adicionar um novo filtro ( i.imgur.com/145dtkx.png ) e filtrá-lo by Log Messageaqui. Você pode colocar FATAL EXCEPTION( i.imgur.com/HpELhaU .png ), portanto, nesta caixa, você pode ler tudo o Exceptionsque é lançado pelo seu aplicativo. Com isso, você não precisa limpar o logcat e executar a falha novamente. Eu acho que o Android Studio também tem essa opção.
Marco Acierno
1
A filtragem do logcat no Eclipse pode ser feita digitando o nome do pacote java no campo nome do aplicativo do filtro.
Stephane
Eu acho que o ponto principal é entender o traço que se obtém quando a exceção acontece. Os FCs são um pouco ruins quando não há vestígios ou não são utilizáveis, e é aí que fica peludo. mas acho que essa explicação é uma boa primeira introdução para encontrar / identificar esses bugs.
DooMMasteR
4
As coisas são fáceis quando o seu logcat tem algum traço de erro, mas e no caso do logcat não ter nada? stackoverflow.com/questions/32455645/…
Marian Paździoch 8/15
4
O problema é que a linha não contém o erro que é gravado e apontado pelo rastreamento de pilha.
Hilal
117

Você pode usar ferramenta ADB do Google para obter Logcat filepara analisar a questão.

adb logcat > logcat.txt

abra o logcat.txtarquivo e procure o nome do seu aplicativo. Deve haver informações sobre o motivo da falha, o número da linha, o nome da classe etc.

Vlad Bezden
fonte
Isso é ótimo, ele mostra rapidamente tudo o que está acontecendo no dispositivo, mesmo que seu depurador não consiga capturá-lo, o que pode acontecer com o Xamarin se o tempo de execução não carregar.
Jvenema #
1
Eu não conseguia ver por que meu aplicativo estava travando no logcat do android studio, não havia erros. Essa resposta me deu o que eu precisava. Mais tarde, no entanto, percebi que tinha algum filtro no logcat do estúdio, o que estava me impedindo de ver o erro. Voltei para "Mostrar apenas o aplicativo selecionado" e estava de volta em funcionamento.
Yannick #
você deve adicionar -d, caso contrário, você deve pressionar Ctrl-C para sair do logcat. Eu façoadb logcat -v time -d > filename.txt
Karakuri
37

Primeiro, verifique em qual ponto seu aplicativo travou ( Unfortunately, MyApp has stopped.). Para isso, você pode usar Log.e("TAG", "Message");, usando esta linha, você pode ver o log do seu aplicativo no logcat.

Depois disso, você descobrirá em que ponto seu aplicativo parou e é muito fácil resolver ao seu lado.

Hiren Vaghela
fonte
28

Basta verificar o erro no log cat.

Você obtém a opção de log cat no eclipse:

window-> show view-> others-> Android-> Logcat

O gato de log contém erro.

Caso contrário, você também pode verificar o erro executando um aplicativo no modo de depuração. Em primeiro lugar, defina o ponto de interrupção depois disso, fazendo:

clique com o botão direito do mouse em projeto-> depurar como-> aplicativo Android

Rahil Ali
fonte
27

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:

imagem

Clique no "Android Monitor" (o que sublinhei na imagem acima. ^)

Agora, você terá algo parecido com isto:

imagem

Altere " Verbose" para " Error" Agora, ele mostrará apenas erros registrados. Não se preocupe com todos esses erros (se você os tiver) agora.

imagem

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: TrumpIsPresidentExceptionpor exemplo. Vá para essa Caused by:instrução no seu logcat.

imagem

Além disso Caused By:, deve haver a exceção que aconteceu. No meu caso, é um RuntimeExceptione abaixo dele deve haver uma linha que contém um link azul como:

imagem

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.dtem 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.


Ab ِ
fonte
1
Esta é uma boa informação, mas o uso de imagens do rastreamento de pilha diminui sua utilidade - as imagens não podem ser pesquisadas, copiadas e coladas, não podem ser captadas pelos leitores de tela e são mais difíceis de ler. (A propósito, eu não diminuí a votação, apenas assinalei isso).
EJoshuaS - Restabelece Monica
1
@EJoshuaS Eu não disse para fornecer imagens.
Ab
19

Este pop-up é exibido apenas quando você recebe uma exceção fatal no seu código que interrompe a execução do aplicativo. Pode ser qualquer exceção NullPointerException,OutOfMemoryException etc.

A melhor maneira de verificar é através do Logcat se você ainda estiver desenvolvendo o aplicativo no Android studio, que é uma maneira rápida de ler o rastreamento de pilha e verificar a causa do aplicativo.

Se seu aplicativo já estiver ativo, você não poderá usar logcat . Portanto, você pode implementar Crashlyticspara fornecer relatórios de erros de qualquer exceção que ocorra.

Ani
fonte
17

Verifique sua Logcatmensagem e veja seu Manifestarquivo. Falta algo como definir a Activity,permissão do usuário, etc.

Manoj ahirwar
fonte
14

Você pode usar qualquer uma destas ferramentas:

  1. adb logcat

  2. adb logcat> logs.txt (você pode usar editores para abrir e procurar erros.)

  3. eclipse logcat (Se não estiver visível no eclipse, vá para Windows-> Mostrar modo de exibição-> Outros-> Android-> LogCat)

  4. Android Debug Monitor ou Android Device Monitor (digite monitor de comando ou abra através da interface do usuário)

insira a descrição da imagem aqui

  1. Android Studio

Sugiro usar o Android Debug Monitor , é bom. Porque o eclipse trava quando há muitos logs, e através do filtro adb logcat e tudo difícil.

Shiv Buyya
fonte
12

Você tem que verificar o Stack trace

Como fazer isso?

no seu IDE Verifique as janelas do formulário LOGCAT

Se você não conseguir ver as janelas do logcat, vá para esse caminho e abra-o

window->show view->others->Android->Logcat

se você estiver usando o Google-Api, vá para este caminho

adb logcat> logcat.txt

alireza amini
fonte
10

No método showToast () abaixo, você precisa passar outro parâmetro para o contexto ou contexto do aplicativo, fazendo isso.

  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();
}
Mayank Nema
fonte
9

Deixe-me compartilhar uma análise básica do Logcat para quando você encontrar um fechamento forçado (quando o aplicativo parar de funcionar).

DOCS

A ferramenta básica do Android para coletar / analisar logs é o logcat.

AQUI é a página do Android sobre logcat

Se você usa o Android Studio, também pode verificar este LINK .

Capturando

Basicamente, você pode capturar manualmente o logcat com o seguinte comando (ou apenas verificar a janela AndroidMonitor no AndroidStudio):

adb logcat

Há muitos parâmetros que você pode adicionar ao comando que ajuda a filtrar e exibir a mensagem que você deseja ... Isso é pessoal ... Eu sempre uso o comando abaixo para obter o carimbo de data / hora da mensagem:

adb logcat -v time

Você pode redirecionar a saída para um arquivo e analisá-la em um editor de texto.

Analisando

Se seu aplicativo estiver travando, você terá algo como:

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

Esta parte do log mostra muitas informações:

  • Quando o problema ocorreu: 07-09 08:29:13.475

É importante verificar quando o problema ocorreu ... Você pode encontrar vários erros em um log ... você deve ter certeza de que está verificando as mensagens adequadas :)

  • Qual aplicativo travou: com.example.khan.abc

Dessa forma, você sabe qual aplicativo travou (para verificar se você está verificando os logs da sua mensagem)

  • Qual ERRO: java.lang.NullPointerException

Um erro de exceção do ponteiro nulo

  • Informações detalhadas sobre o erro: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Você tentou chamar o método onBackPressed()de um FragmentActivityobjeto. No entanto, esse objeto foi nullquando você o fez.

  • Rastreamento de pilha: Rastreamento de pilha mostra a ordem de chamada do método ... Às vezes, o erro ocorre no método de chamada (e não no método chamado).

    em com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)

Ocorreu um erro no arquivo com.example.khan.abc.AudioFragment.java, dentro do onClick()método na linha: 125(stacktrace mostra a linha em que o erro ocorreu)

Foi chamado por:

at android.view.View.performClick(View.java:4848)

Qual foi chamado por:

at android.view.View$PerformClick.run(View.java:20262)

que foi chamado por:

at android.os.Handler.handleCallback(Handler.java:815)

etc ....

Visão geral

Esta foi apenas uma visão geral ... Nem todos os logs são simples, etc. É apenas para compartilhar a ideia e fornecer informações básicas para você ...

Espero poder ajudá-lo de alguma forma ... Atenciosamente

W0rmH0le
fonte
8

Use o LogCat e tente encontrar o que está causando o travamento do aplicativo.

Para ver o Logcat se você usa o Android Studio , pressione ALT + 6 ou

se você usar o Eclipse, então Janela -> Perspectiva aberta -> Outro - LogCat

Vá para o LogCat, no menu suspenso, selecione erro. Isso conterá todas as informações necessárias para ajudá-lo a depurar. Se isso não ajudar, publique o LogCat como uma edição da sua pergunta e alguém o ajudará.

Biswajit Karmakar
fonte
7

Se o seu aplicativo, por algum motivo, travar sem um bom rastreamento de pilha. Tente depurá-lo da primeira linha e siga linha por linha até travar. Então você terá a resposta, qual linha está causando problemas. Provavelmente, você pode envolvê-lo em tentar pegar o bloco e imprimir a saída de erro.

felislynx.silae
fonte
5

Você também pode receber essa mensagem de erro por conta própria, sem nenhum rastreamento de pilha ou qualquer outra mensagem de erro.

Nesse caso, você precisa garantir que o manifesto do Android esteja configurado corretamente (incluindo qualquer fusão de manifesto ocorrida em uma biblioteca e qualquer atividade que venha de uma biblioteca) e prestar atenção especial à primeira atividade exibida no aplicativo nos arquivos de manifesto. .

Pelpotronic
fonte
3
Eu estaria interessado se você pudesse enviar um projeto que demonstra esse fenômeno.
CommonsWare
5

Falha durante o desenvolvimento

Experimente o meu logview de ferramenta favorito para obter os logs e analisá-los durante o desenvolvimento.
Certifique-se de marcar ./logviewe ./lib/logview.jarcomo executável ao executar no Linux.

Se você não gostar, existem muitos visualizadores alternativos de registros de desktop para Android .

Bater em estado selvagem

Integre uma ferramenta de relatório de falhas em tempo real, como o Firebase Crashlytics , a fim de obter traços de pilha de exceções não que ocorreram nos dispositivos dos usuários.

Leia Como liberar um aplicativo de buggy (e viva para contar a história) para saber mais sobre como lidar com bugs no campo.

naXa
fonte
4

As pessoas cometem erros e também codificam.

Sempre que erroracontecer, verifique sempre com o logcat o texto em vermelho, mas você pode descobrir o problema real no texto em azul com sublinhado no texto em vermelho.

Certifique-se de criar um novo activity, sempre declare o activityno AndroidManifestarquivo.

Se adicionar Permissão, declare-a no AndroidMainifestarquivo também.

Kopi Bryant
fonte
4

Logcat - Para verificar os logs na fase de desenvolvimento do Android Studio

Limpe inicialmente o Logcat e deixe o aplicativo travar novamente, para que você possa obter apenas os detalhes do log com falha. Você deve verificar o rastreamento da pilha

Embora, infelizmente, o MyApp tenha parado. Existem muitas razões para isso. Você pode verificar o mesmo nos logs. Para isso, você pode usar o Log.e ("TAG", "Message");

Erro comum durante a falha do aplicativo, como:

  1. Erro de codificação (uso incorreto de palavras-chave).
  2. Nome da propriedade incompatível.
  3. Plug-in não suportado (talvez).
  4. Versão incompatível (talvez).
  5. Atividade ausente no arquivo AndroidManifest.
  6. Permissão ausente no arquivo AndroidManifest.
  7. NullPointerException mais comum.
  8. Declarado mas não definido.

Para resolver o erro de falha do aplicativo:

  • Lembre-se dos pontos acima e passe por isso.
  • Com o erro, você receberá o nome do arquivo também na cor azul (clique neles e salte para o código do erro).
Ashish
fonte
3

Primeiro, você precisa verificar onde e por que seu aplicativo falhou. (Unfortunately, MyApp has stopped.).Com a ajuda de LOG, você pode descobrir o que deu errado.

Depois disso, você descobrirá em que ponto seu aplicativo parou de corrigi-lo.

Mehul Solanki
fonte
3

Se você não possui nenhum tipo de log interessante no seu terminal (ou eles não estão diretamente relacionados ao seu aplicativo), talvez o seu problema seja devido a uma biblioteca nativa. Nesse caso, você deve verificar os arquivos "tombstone" dentro do seu terminal.

O local padrão para os arquivos de marca para exclusão depende de cada dispositivo, mas se for esse o caso, você terá um log informando: Tombstone written to: /data/tombstones/tombstone_06

Para mais informações, consulte https://source.android.com/devices/tech/debug .

zapotec
fonte
0

A execução deste comando no terminal também pode ajudar a encontrar o problema:

gradlew build > log.txt 2>details.txt

você deve ir para o local do arquivo gradlew na leitura de dois arquivos de log acima.

Mohsen Emami
fonte