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

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 stack ?, y ¿cómo puedo usarlo para depurar mis errores de aplicación? , hay muchas preguntas que indican que su aplicación se ha bloqueado, sin más detalles. Esta pregunta tiene como objective instruir a los progtwigdores novatos de Android sobre cómo intentar solucionar ellos mismos sus problemas o hacer las preguntas correctas.

Esta respuesta describe el proceso de recuperación del seguimiento de la stack. ¿Ya tienes el rastro de la stack? Lea sobre rastros de stack en ” ¿Qué es un seguimiento de stack y cómo puedo usarlo para depurar mis errores de aplicación? “

El problema

Su aplicación se cerró porque se lanzó una RuntimeException detectada.
El más común de estos es NullPointerException .

¿Cómo resolverlo?

Cada vez que se bloquea una aplicación de Android (o cualquier aplicación de Java), se escribe un Stack trace en la consola (en este caso, logcat). Esta traza de stack contiene información vital para resolver su problema.

Estudio Android

Encontrar el seguimiento de pila en Android Studio

En la barra inferior de la ventana, Logcat clic en el botón Logcat . Alternativamente, puede presionar alt + 6 . Asegúrate de que tu emulador o dispositivo esté seleccionado en el panel Devices . A continuación, intente encontrar el trazado de la stack, que se muestra en rojo. Es posible que haya un montón de cosas registradas en Logcat, por lo que es posible que deba desplazarse un poco. Una manera fácil de encontrar el seguimiento de stack es borrar el logcat (utilizando la papelera de reciclaje a la derecha) y dejar que la aplicación vuelva a fallar.

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

¡Hurra! Estás a medio camino para resolver tu problema.
Solo tiene que averiguar qué hizo exactamente que se bloquee la aplicación analizando el seguimiento de la stack.

Lea sobre rastros de stack en ” ¿Qué es un seguimiento de stack y cómo puedo usarlo para depurar mis errores de aplicación? ”

¡Todavía no puedo resolver mi problema!

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

Intente ser lo más conciso posible: publique la traza de la stack y el código correspondiente (por ejemplo, unas pocas líneas hasta la línea que arrojó la Exception ).

Puede usar la herramienta ADB de Google para obtener el Logcat file y analizar el problema.

 adb logcat > logcat.txt 

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

Primero, comprueba qué punto se ha bloqueado tu aplicación ( Unfortunately, MyApp has stopped. ). Para esto puede usar Log.e("TAG","Message"); Con esta línea, puede ver que la aplicación inicia sesión en Logcat.

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

Solo revisa el error en log cat.

Obtienes la opción de registro de cat en eclipse:

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

Log cat contiene error.

De otro modo, también puede verificar el error ejecutando una aplicación en modo de depuración. Primero establece un punto de ruptura después de eso haciendo:

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

Nota: Esta respuesta usa Android Studio 2.2.2

Nota 2: considero que su dispositivo está conectado correctamente.


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

imagen

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

Ahora, obtendrás algo como esto:

imagen

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

imagen

De acuerdo. Ahora haz lo que hiciste para bloquear tu aplicación. Después de que su aplicación se cuelga, vaya a su logcat. Debería encontrar un nuevo registro de locking que tenga mucho at:xxx : y Caused by: TrumpIsPresidentException por ejemplo. Vaya a la statement Caused by: en su logcat.

imagen

Junto a Caused By: debe haber una Excepción que sucedió. En mi caso, es una RuntimeException y debajo de ella debe haber una línea que contenga un enlace azul como:

imagen

Si eso Caused by: NO tiene una línea con un texto azul en algún lugar debajo de él, entonces busque otro Caused by: that does.

Haga clic en ese enlace azul . Debería llevarte a donde ocurrió el problema. En mi caso, fue debido 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ó hasta aquí:

 mTextView.setText(myString); 

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

Entonces, descubramos qué es nulo . Hay dos posibilidades. O bien mTextView es nulo, o myString es nulo. Para averiguar, antes de la línea mTextView.setText(mString) , 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 hicimos anteriormente (Cambiamos a Verose a Error), queremos cambiar “Error” a “Depurar”. Ya que estamos iniciando sesión mediante la depuración. 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, como usamos Log.d , estamos comprobando en Debug. Es por eso que lo cambiamos a depuración.

Aviso Log.d tiene un primer parámetro, en nuestro caso “AppDebug”. Haga clic en el menú desplegable “Sin filtros” en la parte superior derecha del logcat. Seleccione “Editar configuración de filtro”, dé un nombre a su filtro, y en “Etiqueta de registro” ponga “Depuración de 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.

Tengo private TextView mTextView declarado 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); 

Así que ESO por qué mTextView es nulo, porque olvidé decirle a mi aplicación de qué se trata. Así que agregué esa línea, ejecuté mi aplicación y ahora la aplicación no falla.


Esta ventana emergente solo se muestra cuando se produce una excepción fatal en el código que detiene la ejecución de la aplicación. Podría ser una excepción NullPointerException, OutOfMemoryException, etc.

La mejor forma de verificarlo es a través de Logcat si todavía está desarrollando la aplicación en el estudio de Android, que es una forma rápida de leer el seguimiento de stack y comprobar la causa de la aplicación.

Si su aplicación ya está en vivo, entonces no puede usar Logcat. Entonces, para eso puede implementar Crashlytics para proporcionarle informes de errores de cualquier excepción que ocurra.

Verifique su mensaje de Logcat y vea su archivo Manifest . Debe haber algo que falta, como definir la Activity, permiso del usuario, etc.

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 ábrase a través de UI)

enter image description here

  1. Estudio Android

Sugiero usar Android Debug Monitor , es bueno. Porque el eclipse se bloquea cuando hay demasiados registros allí, y a través del filtro de adb logcat y todos son difíciles.

Debes verificar el Stack trace

¿Como hacer eso?

en su IDE Compruebe las ventanas de LOGCAT

Si no puede ver las ventanas del 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

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

DOCS

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

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

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

Capturando

Básicamente, puedes 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 le ayudan a filtrar y mostrar el mensaje que desea … Esto es personal … Siempre utilizo 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 cuelga, 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 … Es posible que encuentre varios errores en un registro … debe asegurarse de que está verificando los mensajes adecuados 🙂

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

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

  • Cuál ERROR: java.lang.NullPointerException

Un error de excepción de puntero NULL

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

Intentó llamar al método onBackPressed() desde un objeto FragmentActivity . Sin embargo, ese objeto era null cuando lo hiciste.

  • Stack Trace: Stack Trace 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 ha producido un error en el archivo com.example.khan.abc.AudioFragment.java , dentro del método onClick() 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 de conjunto

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

Espero poder ayudarte de alguna manera … Saludos

En el siguiente método showToast (), debe pasar otro parámetro para el contexto o el contexto de la aplicación, para poder 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(); } 

Use LogCat e intente descubrir qué causa la falla de la aplicación.

Para ver Logcat si usa Android Studio, presione ALT + 6 o

si usa Eclipse, entonces Ventana -> Abrir perspectiva -> Otro – LogCat

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

Si su aplicación falla por algún motivo sin buena stacktrace. Intenta depurarlo desde la primera línea e ir línea por línea hasta que se cuelgue. Entonces tendrás respuesta, qué línea te está causando problemas. De manera adecuada, podría envolverlo en un bloque catch e imprimir el resultado de error.

También puede obtener este mensaje de error por sí mismo, sin ningún rastro de stack o ningún otro mensaje de error.

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

Compruebe el logcat de Android Studio para ver si hay errores, copie esos errores y búsquelo en google o stackoverflow.

La gente comete errores, y también los codifica.

Cuando ocurra cualquier error , siempre verifique con el logcat el texto en rojo, sin embargo, puede encontrar el problema real en el texto de color azul con subrayado en el texto de color rojo.

Asegúrese de crear una nueva activity , siempre declare la activity en el archivo AndroidManifest .

Si agrega Permiso, también debe declararlo en el archivo AndroidMainifest .

Debe comprobar Logcat y el observador por qué la aplicación se bloquea. Porque podría haber muchas razones para bloquear la aplicación.

🙂 GlbMP