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:
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 le mostrará los errores registrados. No se preocupe por todos estos errores (si los tiene) ahora.
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: TrumpIsPresidentException
por ejemplo. Vaya a esa Caused by:
declaración en su logcat.
Además de eso 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 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 mTextView
es nulo o myString
es 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.d
tiene 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 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);
Entonces, ESO es por qué mTextView
es 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.