It propagates back up the stack, collecting details of every line in the path from where it was thrown to the main() method, until it runs out of places to go. Then the thread the exception was thrown from is terminated and a stack trace printed.
Yes you can use 'try' block followed by finally block to avoid exception caught event but any runtime or ( unchecked) exception if occurs will not be logged you can use throws clause to skip try-catch in some cases like IOException or just extend Exception for that class you declared.
The explanation lies in the documentation to java.lang.Thread: each Thread has an UncaughtExceptionHandler wich is responsible for exactly this situation: when an Exception is thrown in a Thread wich is not caught elsewhere.
The usual behaviour is to print a stack-trace to standard error and terminate the Thread.
I'm sure there is something to be found in the big index about that.