Note: This answer is using Android Studio 2.2.2
Note 2: I am considering that your device is successfully connected.
The first thing you do when your application crashes is look into the LogCat, at the bottom of Android Studio there's a toolbar with a list of menus:
![image](https://i.stack.imgur.com/1hRMI.png)
Click on the "Android Monitor" (The one I underlined in the image above. ^)
Now, you'll get something like this:
![image](https://i.stack.imgur.com/f71Qd.png)
Change "Verbose
" to "Error
" Now it will only show you logged errors. Don't worry about all these errors (if you got them) now.
![image](https://i.stack.imgur.com/gpkIa.png)
Ok. Now, do what you did to crash your app. After your app crashes, go to your logcat. You should find a new crash log that has a lot of at:x.x.x
: and Caused by: TrumpIsPresidentException
for example. Go to that Caused by:
statement in your logcat.
![image](https://i.stack.imgur.com/dmNaz.png)
Next to that Caused By:
, there should be the Exception that happened. In my case, it's a RuntimeException
and under it there should be a line which contains a blue link such as:
![image](https://i.stack.imgur.com/VC156.png)
If that Caused by:
DOESN'T have a line with a blue text somewhere under it, then look for another Caused by:
that does.
Click on that blue link. It should take you to where the problem occured. In my case, it was due to this line:
throw new RuntimeException();
So, now I know why it's crashing. It's because I'm throwing the exception myself. This was an obvious error.
However, let's say I got another error:
java.lang.NullPointerException
I checked my logcat, I clicked on the blue link it gave me, and it took me here:
mTextView.setText(myString);
So, now I want to debug. According to this StackOverflow question, a NullPointerException says that something is null
.
So, let's find out what is null. There's two possibilities. Either mTextView
is null, or myString
is null. To find out, before the mTextView.setText(mString)
line, I add these two lines:
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
Now, like we did previously (We changed Verose to Error), we want to change "Error" to "Debug". Since we're logging by debugging. Here's all the Log methods:
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
So, since we used Log.d
, we're checking in Debug. That's why we changed it to debug.
Notice Log.d
has a first parameter,in our case "AppDebug". Click on the "No Filters" drop down menu on the top-right of the logcat. Select "Edit Filter Configuration", give a name to your filter, and in "Log Tag" put "App Debug". Click "OK". Now, you should see two lines in the logcat:
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
So now we know that mTextView is null.
I observe my code, now I notice something.
I have private TextView mTextView
declared at the top of my class. But, I'm not defining it.
Basically I forgot to do this in my onCreate():
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
So THAT'S why mTextView
is null, because I forgot to tell my app what it is. So I add that line, run my app, and now the app doesn't crash.