Preface I've changed the title. It is hard to understand why, while debugging, sometimes uncaught exceptions print 'FATAL EXCEPTION' to the Logcat and sometimes they don't.
The simplified example below crashes when I get to the line client1.getInputStream(). There is no stack trace or other indication inside of Logcat as to what went wrong. I am running Android Studio 3.0.0beta4.
Why is it crashing? (update - crash was due to a SecurityException)
And why does Logcat not show a stack trace or
other error?
Update
Okay, I figured out why it crashes. I added catch(Exception ex) {...} and found that an exception was in fact being thrown, for I had forgotten to test for it. Stupid error, I didn't include INTERNET permission in the manifest.
So, I would still like to know why I would get no error indication for the unhandle exception. The app just quietly disappears.
Edit One commenter says
In java, unhandled exceptions are not printed
Here is the logcat message when I force an unhandled NullPointerException
FATAL EXCEPTION: Thread-6729
Process: com.example.myapplication, PID: 30824
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.InputStream java.net.URLConnection.getInputStream()' on a null object reference
at com.example.myapplication.MainActivity.GetDataAsyncFromPlaystore(MainActivity.java:79)
at com.example.myapplication.MainActivity$1$1.run(MainActivity.java:42)
at java.lang.Thread.run(Thread.java:818)
So, why not for SecurityException?
Edit2 Just to make things more confusing, I've discovered that when I set a break point prior to the exception point, then step through the code and step over the offending line (the one causing the SecurityException), the App abruptly terminates with with no indication as to why. If however, I hit F9 before reaching the offending line, I do, in fact, get a "FATAL EXCEPTION" message logged in Logcat. (Therefore, I've added back the "android-studio" tag to the question.)
So, same question, slightly different wording: Why does the exception print a 'FATAL EXCEPTION' message when debugging one way, but not the other?
The (simplified) code
public void GetDataFromWebsite()
{
Uri queryUri = Uri.parse("https://play.google.com/store/search?q=Planning&c=apps");
try {
URL queryUrl = new URL(queryUri.toString());
URLConnection client1 = queryUrl.openConnection();
InputStream in = client1.getInputStream();
Log.d("Test", "Okay");
} catch (MalformedURLException muex) {
Log.e("Test", "Malformed Url", muex);
} catch (IOException ioex) {
Log.e("Test", "IO Error", ioex);
// } catch(Exception ex) {
// Log.e("Test","Other Exception", ex);
}
}
NOTE:
You are just catching MalformedURLException and IOException. So you won't get other exceptions.
Catch with Exception you will get a trace.
UnHandled exception not printed in android log cat. you can print UnHandled exception by UncaughtExceptionHandler. Here is a like to implement UncaughtExceptionHandler: Logging unhandled exceptions in Android Activity
There is no relativity between NullpointerException and SecurityException. How it will get caught by SecurityException.
Related
I'm trying to implement an uncaught exception handler in an Android only app built with Xamarin for logging purposes.
AppDomain.CurrentDomain.UnhandledException += (o, e) => exLogger.UncaughtException((Exception)e.ExceptionObject);
TaskScheduler.UnobservedTaskException += (o, e) => exLogger.UncaughtException(e.Exception);
and
public void UncaughtException(Exception ex)
{
try
{
Log.Error(TAG, "Exception caught: {0}", ex.Message ?? "Unknown Exception");
var di = Directory.CreateDirectory(Path.Combine(context.FilesDir.AbsolutePath, TAG));
//Rest of Handler - saves error to file system, attempts to upload to a server
...
}
catch (Exception)
{
Log.Error(TAG, "Exception handler failed");
}
}
The handler in question works with zero problems when I implement it in a very simple "Hello World" application, where I trigger an exception on button-press:
throw new Exception("this is a test exception");
(or similar).
However, When I do the same thing in the application I am actually developing, the app crashes inside the handler, printing no further information as to why this happens.
When I step through my code, the debugger hits a breakpoint at the entry to the handler - e.g. within the try block, but before the Log.Error line. However, attempting to step further than this point results in immediate app crash, without either the Log.Debug line in the try OR catch block being executed - nothing is printed to the ADB Logger. Additionally, the error printed to the ADB Log by W/system.err is only the error I intentionally caused (to trigger the handler) - no information on the crash WITHIN the handler is provided.
Does anyone have any idea what could be causing this crash, or even advice on how to get more information from the ADB logs on what the crash within the handler was caused by? My only train of thought is that, because my app is a WebView application, potentially the WebView itself is consuming the Exception in some manner? Any help is greatly appreciated!
Calling Log.e(TAG, "some message", e) where e is an UnknownHostException, does not print the stack trace on the logcat.
Since May 20, 2011, there is a change in the Log class, such that UnknownHostException exceptions are not printed.
This is to reduce the amount of log spew that apps do in the non-error
condition of the network being unavailable.
https://github.com/android/platform_frameworks_base/commit/dba50c7ed24e05ff349a94b8c4a6d9bb9050973b
The e you are including is useless, remove it and it would be visible in logcat.
Log.e(TAG, "some message");
Logcat prints a single line with just the message and no exception stack trace. I am passing the exception e to the Log.i function. It used to work before. Now I can only see the stack trace using e.printStackTrace() which prints it to system.err.
catch (final IOException e) {
Log.i(TAG, "Error connecting to server.", e);
}
I think it may be because my current project is an Android Library and not an Application.
It's supposed to look like this but instead I only get the very first line. In my case it says "Error connecting to server." in place of "FATAL EXCEPTION: main".
I have been working with Eclipse/Android development porting a game from windows for about a month now.
But I have been frustrated with some aspects of this Environment.
When I get an exception, very rarely does the debugger stop where it needs to.
I have tried adding Exception breakpoints, this helps hit a few errors in relevant code but still very hit and miss.
Visual studio always stops execution in the closest entry point to the throwing of the exception, and I really miss that.
Even a minor
myArrayList[outOfBounds]
does not stop on the line that caused the issue.
I would like to know what experienced android developers do to track down the cause of exceptions quickly.
Put a try{ block around the statements that are going to generate the exception and then in the catch do something like
catch (Exception e) {
System.out.println("Test \"" + arg +
"\" threw a " + e.getClass() +
"\n with message: " + e.getMessage());
}
You can use try - catch block. Whenever any exception comes your catch block will be executed so you can put alert or message in catch block to track your problem or you can use Exception parent class to trace your bug.
try{
Your code to execute
}catch(Exception e){
e.printStackTrace();
}
This will give you error log in your logcat.
Is it possible to get variable values included in a stack trace? I have just started using bugsense which emails the stacktrace to me and I wonder if there is some way in my code to put the variable values into the stacktrace output
Not by default, you have to do it by yourself:
The stack trace will only tell you about the involved line of code (where the Exception is thrown) and the execution stack.
But nothing prevents you from catching the Exception and to include some debug information in the message:
try {
...the code...
}
catch (Throwable t) {
// Here, we catch any Throwable (Exception but also Error such as OutOfMemory
// or NoClassDefFound), which is *absolutely not suitable* for
// anything else than debugging.
// You can (should, actually) make this catch statement more specific
// depending of the Exception or Error you are facing
// Dump your variables here:
final String message = "myVar=" + myVar;
// The statement below rethrows the original Throwable and adds your
// own message to it
throw new RuntimeException(message, t);
}
Or to put a breakpoint in the catch { } statement to inspect the state of your application at that stage, but as I understood it may not be applicable in the case you are describing.
(By the way, I suggest you add the tag "Java" to your question. This way it will also be visible by the Java community of StackOverflow)