Sunday, 16 December 2018

java - Unfortunately MyApp has stopped. How can I solve this?

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




Click on the "Android Monitor" (The one I underlined in the image above. ^)



Now, you'll get something like this:



image



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




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



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



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.





No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...