java - funcionar - Desafortunadamente MyApp se ha detenido. ¿Como puedo resolver esto?
errores comunes en android studio (16)
Crash durante el desarrollo
Intente logview-0.20 para obtener los registros y analizarlos durante el desarrollo.
Asegúrese de marcar ./logview
y ./lib/logview.jar
como ejecutables cuando se ejecute en Linux.
Si no te gusta, hay muchos visores de registro de escritorio alternativos para Android .
Choque en la naturaleza
Integre una herramienta de informes de fallos en tiempo real como Firebase Crashlytics para obtener pilas de excepciones no manejadas que ocurrieron en los dispositivos de los usuarios.
Lea Cómo lanzar una aplicación de Buggy (y Live to Tell the Tale) para saber más sobre el manejo de errores en el campo.
Estoy desarrollando una aplicación, y cada vez que la ejecuto, recibo el mensaje:
Desafortunadamente, 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 tratar de solucionar sus problemas por sí mismos, o hacer las preguntas correctas.
En el método showToast (), a continuación, debe pasar otro parámetro para el contexto o el contexto de la aplicación; para ello, puede intentarlo.
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();
}
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, OutOfMemoryException etc.
La mejor forma de verificarlo es a través de Logcat si aún está desarrollando la aplicación en Android studio, 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, entonces no puede usar logcat. Entonces, para eso puede implementar Crashlytics para proporcionarle informes de errores de cualquier excepción que ocurra.
La gente comete errores, y también la codificación.
Cuando ocurra un error
, siempre verifique con el logcat con el texto en color rojo, sin embargo, puede descubrir el problema real en el texto de color azul con subrayado en el texto de color rojo.
Asegúrese de que si crea una nueva activity
, siempre declare la activity
en el archivo AndroidManifest
.
Si agrega Permiso, declare también en el archivo de AndroidMainifest
.
Permítame compartir un análisis Logcat básico para cuando cumpla con un cierre de fuerza (cuando la aplicación deja de funcionar).
DOCS
La herramienta básica de Android para recopilar / analizar registros es el logcat.
HERE está la página de Android sobre logcat
Si usas Android Studio, también puedes consultar este LINK .
Capturando
Básicamente, MANUALMENTE puede capturar logcat con el siguiente comando (o simplemente revisar la ventana de AndroidMonitor en AndroidStudio):
adb logcat
Hay muchos parámetros que puedes agregar al comando que te ayudan a filtrar y mostrar el mensaje que deseas ... Esto es personal ... Siempre uso el comando a continuación para obtener la marca de tiempo del mensaje:
adb logcat -v time
Puede redirigir la salida a un archivo y analizarla en un Editor de texto.
Analizando
Si tu aplicación se bloquea, obtendrás 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 asegurarse de que está verificando los mensajes correctos :)
- Que aplicación se
com.example.khan.abc
:com.example.khan.abc
De esta manera, usted sabe qué aplicación se bloqueó (para asegurarse de que está revisando los registros de 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
onBackPressed()
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 produjo 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 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
Primero verifique en qué punto se bloqueó su aplicación ( Unfortunately, MyApp has stopped.
). Para esto puedes usar Log.e("TAG","Message");
, usando esta línea puedes ver tu aplicación iniciar sesión en logcat.
Después de que encuentre qué punto ha dejado su aplicación, es muy fácil de resolver a su lado.
Puede usar la herramienta ADB de Google para obtener el Logcat file
para analizar el problema.
adb logcat > logcat.txt
logcat.txt
archivo logcat.txt
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.
Puedes usar cualquiera de estas herramientas:
adb logcat
adb logcat> logs.txt (puede usar editores para abrir y buscar errores).
eclipse logcat (si no está visible en eclipse, vaya a Windows-> Mostrar vista-> Otros-> Android-> LogCat)
- Android Debug Monitor o Android Device Monitor (escriba el comando command monitor o abra a través de la interfaz de usuario)
- Android Studio
Sugiero usar Android Debug Monitor , es bueno. Porque eclipse se cuelga cuando hay demasiados registros, y mediante el filtro logcat adb, todo es difícil.
Revise su mensaje Logcat
y vea su archivo Manifest
. Debería faltar algo, como definir la Activity,
permiso del usuario, etc.
Si tu aplicación por alguna razón falla sin un buen stacktrace. Intente depurarlo desde la primera línea, y vaya línea por línea hasta que se bloquee. Entonces tendrás respuesta, qué línea te está causando problemas. Probablemente podría envolverlo en el bloque try catch e imprimir la salida del error.
Solo revisa el error en log cat.
Obtienes la opción log cat en eclipse:
ventana-> mostrar vista-> otros-> Android-> Logcat
El gato del registro contiene error.
De otra manera, también puede verificar el error ejecutando una aplicación en modo de depuración. Primero establece el punto de ruptura después de eso haciendo:
haga clic derecho en proyecto-> depurar como-> aplicación de Android
También puede obtener este mensaje de error por sí solo, sin ningún seguimiento de pila o cualquier 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 suceda de 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. .
Tienes que comprobar la Stack trace
¿Como hacer eso?
en su IDE Compruebe el formulario de Windows LOGCAT
Si no puede ver las ventanas logcat vaya a esta ruta y ábrala
window->show view->others->Android->Logcat
Si estás utilizando Google-Api ve a este camino
adb logcat> logcat.txt
Use el LogCat e intente encontrar qué está causando que la aplicación se bloquee.
Para ver Logcat si usa Android Studio, presione ALT + 6 o
Si usa Eclipse, entonces Ventana -> Abrir perspectiva -> Otro - LogCat
Vaya a LogCat, desde el menú desplegable seleccione el error. Esto contendrá toda la información requerida para ayudarte a depurar. Si eso no ayuda, publique el LogCat como una edición para su pregunta y alguien lo ayudará.
Esta respuesta describe el proceso de recuperación del seguimiento de la pila. ¿Ya tienes el rastro de pila? Lea sobre las trazas de pila en " ¿Qué es una traza de pila, y cómo puedo usarla para depurar los errores de mi aplicación? "
El problema
Su aplicación se cerró porque se lanzó una excepción RuntimeException
.
El más común de estos es la NullPointerException
.
¿Cómo resolverlo?
Cada vez que una aplicación de Android falla (o cualquier aplicación de Java), se escribe un Stack trace
en la consola (en este caso, logcat). Este seguimiento de pila contiene información vital para resolver su problema.
Android Studio
En la barra inferior de la ventana, haga clic en el botón Logcat
. Alternativamente, puede presionar alt + 6 . Asegúrese de que su emulador o dispositivo esté seleccionado en el panel Devices
. A continuación, intente encontrar la traza de 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 forma 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 vuelva a fallar.
He encontrado el rastro de pila, ¿ahora qué?
¡Hurra! Estás a medio camino de resolver tu problema.
Solo necesita averiguar qué fue lo que hizo que su aplicación fallara exactamente, analizando el seguimiento de la pila.
Lea sobre las trazas de pila en " ¿Qué es una traza de pila, y cómo puedo usarla para depurar los errores de mi aplicación? "
¡Todavía no puedo resolver mi problema!
Si ha encontrado su Exception
y la línea donde ocurrió, y aún no puede resolverlo, no dude en hacer una pregunta en .
Trate de ser lo más conciso posible: publique el seguimiento de la pila y el código relevante (por ejemplo, unas pocas líneas hasta la línea que lanzó la Exception
).
Nota: esta respuesta está utilizando 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 LogCat, en la parte inferior de Android Studio hay una barra de herramientas con una lista de menús:
Haga clic en el "Monitor de Android" (el que subrayé en la imagen de arriba. ^)
Ahora, obtendrás algo como esto:
Cambie " Verbose
" a " Error
". Ahora solo mostrará los errores registrados. No te preocupes por todos estos errores (si los tienes) ahora.
De acuerdo. Ahora, haz lo que hiciste para bloquear tu aplicación. Después de que su aplicación falla, vaya a su logcat. Debería encontrar un nuevo registro de Caused by: TrumpIsPresidentException
que tenga un montón de at:xxx
: y Caused by: TrumpIsPresidentException
por ejemplo. Vaya a la Caused by:
en su logcat.
Junto a ese Caused By:
debería haber la Excepción que sucedió. En mi caso, es una RuntimeException
y debajo de ella debería haber una línea que contenga un enlace azul como:
Si eso es Caused by:
NO TIENE una línea con un texto azul en algún lugar debajo de él, entonces busque otro Caused by:
eso sí.
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é se está estrellando. Es porque yo mismo estoy lanzando la excepción. Este fue un error obvio .
Sin embargo, digamos que tengo 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 NullPointerException , una NullPointerException dice que algo es null
.
Entonces, averigüemos qué es nulo . Hay dos posibilidades. O bien mTextView
es nulo o myString
es nulo. Para averiguarlo, 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 Verose a Error), queremos cambiar "Error" a "Debug". Ya que estamos registrando por 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 revisando Debug. Es por eso que lo cambiamos para depurar.
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", asigne un nombre a su filtro y en "Etiqueta de registro" ponga "Depuración de aplicación". Haga clic en Aceptar". Ahora, deberías ver dos líneas en el logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
Así que 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);
Por eso es que mTextView
es nulo, porque olvidé decirle a mi aplicación qué es. Así que agrego esa línea, ejecuto mi aplicación y ahora la aplicación no falla.