Lamentablemente, MyApp se ha detenido. ¿Como puedo resolver esto?

787

Estoy desarrollando una aplicación, y cada vez que la ejecuto, recibo el mensaje:

Lamentablemente, MyApp se ha detenido.

¿Qué puedo hacer para resolver esto?


Acerca de esta pregunta, obviamente inspirada en ¿Qué es un seguimiento de pila y cómo puedo usarlo para depurar los errores de mi aplicación? , hay muchas preguntas que indican que su aplicación se ha bloqueado, sin más detalles. Esta pregunta tiene como objetivo instruir a los programadores novatos de Android sobre cómo intentar solucionar sus problemas por sí mismos, o hacer las preguntas correctas.

nhaarman
fuente
22
He visto muchas preguntas cerrarse como engañados con esto. Esta es una buena referencia para ayudar a las personas a publicar datos relevantes en sus preguntas. Sin embargo, este no es un duplicado de ningún problema raíz, sino una metodología para desenterrar el problema raíz. Creo que sería mejor proporcionar el enlace a esta pregunta como referencia y no cerrar como duplicado.
laalto
33
Creo que la función de cierre es perfecta para esto. La mayoría de estas preguntas muestran poco conocimiento de las habilidades básicas de depuración. Ponerlos en espera les brinda la oportunidad de aclarar su problema, utilizando el método que se indica en la respuesta. Mejor aún, podrían resolver el problema por sí mismos. Sin embargo, esta discusión podría ser más adecuada para meta.stackoverflow.com.
nhaarman
Esta pregunta es muy vaga. Una mejor pregunta sería 'usando [myIDE] ¿cómo puedo depurar' una aplicación de Android que muestra el error 'Desafortunadamente, MyApp se ha detenido'
Chris Halcrow
77
@ChrisHalcrow Este Q / A no se trata de depuración en absoluto. Se trata de guiar a los principiantes en Android a lidiar con los bloqueos de aplicaciones.
nhaarman
stackoverflow.com/questions/26609734/… .. habilite el error multidex becoz en convertir a apk
RejoylinLokeshwaran

Respuestas:

719

Esta respuesta describe el proceso de recuperación del seguimiento de la pila. ¿Ya tienes el rastro de la pila? Lea sobre los seguimientos de pila en " ¿Qué es un seguimiento de pila y cómo puedo usarlo para depurar los errores de mi aplicación? "

El problema

Su aplicación se cerró porque RuntimeExceptionse arrojó una captura .
El más común de estos es el NullPointerException.

¿Cómo resolverlo?

Cada vez que se bloquea una aplicación de Android (o cualquier aplicación de Java), Stack tracese escribe a en la consola (en este caso, logcat). Este seguimiento de la pila contiene información vital para resolver su problema.

Android Studio

Encontrar el seguimiento de la pila en Android Studio

En la barra inferior de la ventana, haga clic en el Logcatbotón. Alternativamente, puede presionar alt+ 6. Asegúrese de que su emulador o dispositivo esté seleccionado en el Devicespanel. A continuación, intente encontrar el seguimiento de la pila, que se muestra en rojo. Es posible que haya muchas cosas registradas en logcat, por lo que es posible que deba desplazarse un poco. Una manera fácil de encontrar el seguimiento de la pila es borrar el logcat (usando la papelera de reciclaje a la derecha) y dejar que la aplicación se bloquee nuevamente.

He encontrado el rastro de la pila, ¿y ahora qué?

¡Hurra! Estás a medio camino de resolver tu problema.
Solo necesita averiguar qué hizo exactamente que su aplicación se bloqueara, analizando el seguimiento de la pila.

Lea sobre los seguimientos de pila en " ¿Qué es un seguimiento de pila y cómo puedo usarlo para depurar los errores de mi aplicación? "

¡Todavía no puedo resolver mi problema!

Si ha encontrado su Exceptiony la línea donde ocurrió, y todavía no puede encontrar la manera de solucionarlo, no dude en hacer una pregunta en StackOverflow.

Trate de ser lo más conciso posible: publique el seguimiento de la pila y el código relevante (por ejemplo, algunas líneas hasta la línea que arrojó el Exception).

nhaarman
fuente
33
Sé que esta publicación es antigua: pero si usa IntelliJ IDEA, puede ingresar Android > Devices|Logcaty agregar un nuevo filtro ( i.imgur.com/145dtkx.png ), y filtrarlo by Log Messageaquí, puede poner FATAL EXCEPTION( i.imgur.com/HpELhaU .png ) para que en este cuadro pueda leer todos los Exceptionsque arroja su aplicación. Con esto no necesita borrar logcat y hacer el bloqueo nuevamente. Creo que Android Studio también tiene esta opción.
Marco Acierno
1
El filtrado de logcat en Eclipse se puede hacer escribiendo el nombre del paquete de Java en el campo del nombre de la aplicación del filtro.
Stephane
Creo que el punto principal es entender el rastro que uno tiene cuando ocurre la excepción. Los FC son un poco malos cuando no hay rastro o no se puede usar, que es donde se pone peludo. pero creo que esta explicación es una buena primera introducción para encontrar / identificar tales errores.
DooMMasteR
44
Las cosas son fáciles cuando su logcat tiene algún rastro de error, pero ¿qué pasa si logcat no tiene nada? stackoverflow.com/questions/32455645/…
Marian Paździoch
44
El problema es que la línea no contiene el error que está escrito y señalado por el seguimiento de la pila.
Hilal
117

Puede utilizar la herramienta ADB de Google para obtener Logcat filepara analizar el tema.

adb logcat > logcat.txt

abra el logcat.txtarchivo y busque el nombre de su aplicación. Debe haber información sobre por qué falló, el número de línea, el nombre de la clase, etc.

Vlad Bezden
fuente
Esto es genial, le mostrará rápidamente todo lo que sucede en el dispositivo, incluso si su depurador no puede detectarlo, lo que puede suceder con Xamarin si el tiempo de ejecución no se carga.
jvenema
1
No podía ver por qué mi aplicación se bloqueaba en el logcat de Android Studio, no había ningún error. Esta respuesta me dio lo que necesitaba. Más tarde, sin embargo, me di cuenta de que tenía un filtro en el logcat del estudio que me impedía ver el error. Volví a "Mostrar solo la aplicación seleccionada" y volví a funcionar.
Yannick
debe agregar -d, de lo contrario, deberá presionar ctrl-C para salir de logcat. Yo síadb logcat -v time -d > filename.txt
Karakuri
37

Primero, verifica en qué punto se ha bloqueado su aplicación ( Unfortunately, MyApp has stopped.). Para esto, puede usar Log.e("TAG", "Message");, usando esta línea puede ver el registro de su aplicación en logcat.

Después de eso, descubre qué punto se ha detenido su aplicación es muy fácil de resolver a su lado.

Hiren Vaghela
fuente
28

Simplemente verifique el error en log cat.

Obtiene la opción log cat de eclipse:

ventana-> mostrar vista-> otros-> Android-> Logcat

Log cat contiene error.

De lo contrario, también puede verificar el error ejecutando una aplicación en modo de depuración. Primero establezca el punto de interrupción después de eso haciendo:

haga clic derecho en proyecto-> depurar como-> aplicación de Android

Rahil Ali
fuente
27

Nota: Esta respuesta está usando Android Studio 2.2.2

Nota 2: estoy considerando que su dispositivo está conectado correctamente.


Lo primero que hace cuando su aplicación falla es mirar en LogCat, en la parte inferior de Android Studio hay una barra de herramientas con una lista de menús:

imagen

Haga clic en el "Monitor de Android" (El que subrayé en la imagen de arriba. ^)

Ahora, obtendrás algo como esto:

imagen

Cambie " Verbose" a " Error" Ahora solo le mostrará los errores registrados. No se preocupe por todos estos errores (si los tiene) ahora.

imagen

Okay. Ahora, haz lo que hiciste para bloquear tu aplicación. Después de que su aplicación se bloquee, vaya a su logcat. Debería encontrar un nuevo registro de bloqueo que tenga muchos at:x.x.x: y Caused by: TrumpIsPresidentExceptionpor ejemplo. Vaya a esa Caused by:declaración en su logcat.

imagen

Además de eso Caused By:, debería haber la excepción que sucedió. En mi caso, es una RuntimeExceptiony debajo de ella debería haber una línea que contenga un enlace azul como:

imagen

Si esoCaused by: NO TIENE una línea con un texto azul en alguna parte debajo de ella, busque otra Caused by:que sí la tenga .

Haga clic en ese enlace azul . Debería llevarte a donde ocurrió el problema. En mi caso, se debió a esta línea:

throw new RuntimeException();

Entonces, ahora sé por qué está fallando. Es porque estoy lanzando la excepción yo mismo. Este fue un error obvio .


Sin embargo, digamos que recibí otro error:

java.lang.NullPointerException

Revisé mi logcat, hice clic en el enlace azul que me dio, y me llevó aquí:

mTextView.setText(myString);

Entonces, ahora quiero depurar. De acuerdo con esta pregunta de StackOverflow , una excepción NullPointerException dice que algo es null.

Entonces, descubramos qué es nulo . Hay dos posibilidades O mTextViewes nulo o myStringes nulo. Para averiguarlo, antes de la mTextView.setText(mString)línea, agrego estas dos líneas:

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

Ahora, como lo hicimos anteriormente (cambiamos Verose a Error), queremos cambiar "Error" a "Depurar". Ya que estamos iniciando sesión depurando. Aquí están todos los métodos de registro:

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

Entonces, desde que usamos Log.d, estamos revisando la depuración. Por eso lo cambiamos a depurar.

El aviso Log.dtiene un primer parámetro, en nuestro caso "AppDebug". Haga clic en el menú desplegable "Sin filtros" en la esquina superior derecha de logcat. Seleccione "Editar configuración de filtro", asigne un nombre a su filtro y en "Etiqueta de registro" coloque "Depuración de la aplicación". Haga clic en Aceptar". Ahora, debería ver dos líneas en el logcat:

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

Entonces ahora sabemos que mTextView es nulo.

Observo mi código, ahora noto algo.

He private TextView mTextViewdeclarado en la parte superior de mi clase. Pero no lo estoy definiendo.

Básicamente olvidé hacer esto en mi onCreate ():

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

Entonces, ESO es por qué mTextViewes nulo, porque olvidé decirle a mi aplicación qué es. Entonces agrego esa línea, ejecuto mi aplicación, y ahora la aplicación no se bloquea.


Ab ِ
fuente
1
Esta es una buena información, pero el uso de imágenes de Stack Trace disminuye su utilidad : las imágenes no se pueden buscar, no se pueden copiar ni pegar, los lectores de pantalla no pueden recogerlas y son más difíciles de leer. (Por cierto, no lo rechacé, solo lo señalé).
EJoshuaS - Restablece a Mónica
1
@EJoshuaS No dije que proporcionara imágenes aunque.
Ab
19

Esta ventana emergente se muestra solo cuando obtiene una excepción fatal en su código que detiene la ejecución de la aplicación. Podría ser cualquier excepción NullPointerException, OutOfMemoryExceptionetc.

La mejor manera de verificar es a través de Logcat si aún está desarrollando la aplicación en el estudio de Android, que es una forma rápida de leer el seguimiento de la pila y verificar la causa de la aplicación.

Si su aplicación ya está activa, no puede usar logcat . Entonces, para eso puede implementar Crashlyticspara proporcionarle informes de errores de cualquier excepción que ocurra.

Y yo
fuente
17

Verifique su Logcatmensaje y vea su Manifestarchivo. Debería faltar algo como definir el Activity,permiso del usuario`, etc.

Manoj ahirwar
fuente
14

Puede usar cualquiera de estas herramientas:

  1. adb logcat

  2. adb logcat> logs.txt (puede usar editores para abrir y buscar errores).

  3. eclipse logcat (Si no está visible en eclipse, vaya a Windows-> Mostrar vista-> Otros-> Android-> LogCat)

  4. Android Debug Monitor o Android Device Monitor (escriba command monitor o abra a través de la interfaz de usuario)

ingrese la descripción de la imagen aquí

  1. Android Studio

Sugiero usar Android Debug Monitor , es bueno. Porque el eclipse se cuelga cuando hay demasiados registros, y a través del filtro adb logcat y todo es difícil.

Shiv Buyya
fuente
12

Tienes que revisar el Stack trace

¿Como hacer eso?

en su IDE Compruebe el formulario de Windows LOGCAT

Si no puede ver las ventanas de logcat, vaya a esta ruta y ábrala

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

si está utilizando Google-Api, vaya a esta ruta

adb logcat> logcat.txt

alireza amini
fuente
10

En el siguiente método showToast (), debe pasar otro parámetro para el contexto o el contexto de la aplicación, de esta manera puede probarlo.

  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
fuente
9

Permítame compartir un análisis básico de Logcat para cuando encuentre un cierre forzado (cuando la aplicación deje de funcionar).

DOCS

La herramienta básica de Android para recopilar / analizar registros es el logcat.

AQUÍ está la página de Android sobre logcat

Si usa Android Studio, también puede consultar este ENLACE .

Capturar

Básicamente, puede capturar MANUALMENTE logcat con el siguiente comando (o simplemente verificar la ventana de AndroidMonitor en AndroidStudio):

adb logcat

Hay muchos parámetros que puede agregar al comando que lo ayudan a filtrar y mostrar el mensaje que desea ... Esto es personal ... Siempre uso el siguiente comando para obtener la marca de tiempo del mensaje:

adb logcat -v time

Puede redirigir el resultado a un archivo y analizarlo en un Editor de texto.

Analizando

Si su aplicación se bloquea, obtendrá 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 del registro muestra mucha información:

  • Cuando ocurrió el problema: 07-09 08:29:13.475

Es importante verificar cuándo ocurrió el problema ... Puede encontrar varios errores en un registro ... debe estar seguro de que está revisando los mensajes correctos :)

  • Qué aplicación se bloqueó: com.example.khan.abc

De esta manera, usted sabe qué aplicación se bloqueó (para asegurarse de que está revisando los registros sobre su mensaje)

  • Qué ERROR: java.lang.NullPointerException

Un error de excepción de puntero nulo

  • Información detallada sobre el error: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

Intentaste llamar al método onBackPressed()desde un FragmentActivityobjeto. Sin embargo, ese objeto fue nullcuando lo hiciste.

  • Seguimiento de pila: el seguimiento de pila le muestra el orden de invocación del método ... A veces, el error ocurre en el método de llamada (y no en el método llamado).

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

Se produjo un error en el archivo com.example.khan.abc.AudioFragment.java, dentro del onClick()método en la línea: 125(stacktrace muestra la línea en la que ocurrió el error)

Fue llamado por:

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

Que fue llamado por:

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

que fue llamado por:

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

etc ....

Visión general

Esto fue solo una descripción general ... No todos los registros son simples, etc. Es solo para compartir la idea y brindarle información de nivel de entrada ...

Espero poder ayudarte de alguna manera ... Saludos

W0rmH0le
fuente
8

Use el LogCat e intente encontrar qué está causando el bloqueo de la aplicación.

Para ver Logcat si utiliza Android Studio y luego Presione ALT + 6 o

si usa Eclipse, luego Ventana -> Abrir perspectiva -> Otro - LogCat

Vaya a LogCat, desde el menú desplegable seleccione error. Esto contendrá toda la información requerida para ayudarlo a depurar. Si eso no ayuda, publique LogCat como una edición a su pregunta y alguien lo ayudará.

Biswajit Karmakar
fuente
7

Si su aplicación por alguna razón se bloquea sin un buen stacktrace. Intente depurarlo desde la primera línea y vaya línea por línea hasta el bloqueo. Entonces tendrá respuesta, qué línea le está causando problemas. Probablemente, podría envolverlo en try catch block e imprimir la salida de error.

felislynx.silae
fuente
5

También puede obtener este mensaje de error por sí solo, sin ningún seguimiento de pila ni ningún otro mensaje de error.

En este caso, debe asegurarse de que su manifiesto de Android esté configurado correctamente (incluida cualquier fusión de manifiesto que ocurra desde una biblioteca y cualquier actividad que provenga de una biblioteca), y prestar especial atención a la primera actividad que se muestra en su aplicación en sus archivos de manifiesto .

Pelpotronico
fuente
3
Me interesaría poder subir un proyecto que demuestre este fenómeno.
CommonsWare
5

Choque durante el desarrollo

Pruebe mi vista de registro de herramienta favorita para obtener los registros y analizarlos durante el desarrollo.
Asegúrese de marcar ./logviewy ./lib/logview.jarcomo ejecutable cuando se ejecuta en Linux.

Si no le gusta, hay muchos visores de registro de escritorio alternativos para Android .

Choque en la naturaleza

Integre una herramienta de informe de fallas en tiempo real como Firebase Crashlytics en , para obtener rastros de excepciones no controladas que ocurrieron en los dispositivos de los usuarios.

Lea Cómo liberar una aplicación Buggy (y Live to Tell the Tale) para saber más sobre cómo manejar errores en el campo.

naXa
fuente
4

La gente comete errores, y también la codificación.

Cuando errorocurra algo, consulte siempre con el logcat con el texto en color rojo, sin embargo, puede encontrar el problema real en el texto en color azul con subrayado en el texto en color rojo.

Asegúrese de crear un nuevo activity, siempre declare el activityen elAndroidManifest archivo.

Si agrega Permiso, declare también en el AndroidMainifestarchivo.

Kopi Bryant
fuente
4

Logcat : para verificar los registros en la fase de desarrollo de Android Studio

Inicialmente borre Logcat y deje que la aplicación se bloquee nuevamente para que solo pueda obtener detalles de registro bloqueados. Tienes que verificar el seguimiento de la pila

Mientras, desafortunadamente, MyApp se ha detenido. Hay muchas razones para ello. Puede verificar lo mismo en los registros. Para esto, puede usar el Log.e ("TAG", "Mensaje");

Error común durante el bloqueo de la aplicación como:

  1. Error de codificación (uso incorrecto de palabras clave).
  2. Nombre de propiedad no coincidente.
  3. Complemento no compatible (tal vez).
  4. Versión no coincidente (tal vez).
  5. Falta actividad en el archivo AndroidManifest.
  6. Falta el permiso en el archivo AndroidManifest.
  7. NullPointerException más común.
  8. Declarado pero no definido.

Para resolver el error de bloqueo de la aplicación:

  • Tenga en cuenta los puntos anteriores y repáselo.
  • Con el error, obtendrá el nombre del archivo también en color azul (haga clic en ellos y salte al código del error).
Ashish
fuente
3

Primero, debe verificar dónde y por qué su aplicación se ha bloqueado (Unfortunately, MyApp has stopped.).Con la ayuda de LOG, puede averiguar qué salió mal.

Después de eso, encuentra qué punto ha detenido su aplicación y corrija eso desde su punto.

Mehul Solanki
fuente
3

Si no tiene ningún tipo de registro interesante en su terminal (o no están directamente relacionados con su aplicación), tal vez su problema se deba a una biblioteca nativa. En ese caso, debe verificar los archivos "tombstone" dentro de su terminal.

La ubicación predeterminada para los archivos tombstone depende de cada dispositivo, pero si ese es el caso, tendrá un registro que dice: Tombstone written to: /data/tombstones/tombstone_06

Para obtener más información, consulte https://source.android.com/devices/tech/debug .

zapoteco
fuente
0

También ejecutar este comando en la terminal puede ayudar a encontrar el problema:

gradlew build > log.txt 2>details.txt

entonces debe ir a la ubicación del archivo gradlew en leer los dos archivos de registro anteriores.

Mohsen Emami
fuente