In this code will someVar
be set even if the catch block is executed and the second Exception is thrown?
public void someFuncti开发者_如何学Goon() throws Exception {
try {
//CODE HERE
} catch (Exception e) {
Log.e(TAG, "", e);
throw new Exception(e);
} finally {
this.someVar= true;
}
}
Yes, the finally blocks always runs... except when:
- The thread running the try-catch-finally block is killed or interrupted
- You use
System.exit(0);
- The underlying VM is destroyed in some other way
- The underlying hardware is unusable in some way
Additionally, if a method in your finally block throws an uncaught exception, then nothing after that will be executed (i.e. the exception will be thrown as it would in any other code). A very common case where this happens is java.sql.Connection.close()
.
As an aside, I am guessing that the code sample you have used is merely an example, but be careful of putting actual logic inside a finally block. The finally block is intended for resource clean-up (closing DB connections, releasing file handles etc), not for must-run logic. If it must-run do it before the try-catch block, away from something that could throw an exception, as your intention is almost certainly functionally the same.
Yes.
See the documentation:
The finally block always executes when the try block exits.
Exceptions:
Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.
Finally, block always executes.
public class ExceptionTest {
public static void someFunction(String input) throws Exception {
try {
if( input.equals("ABC") ) {
System.out.println("Matched");
}
} catch (Exception e) {
throw new Exception(e);
} finally {
System.out.println("Input Is "+input+" Finally Executed!!!");
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.out.println("********* Test with VALUE ********* ");
someFunction("ABC");
System.out.println("\r\n********* Test with NULL ********* ");
someFunction(null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Finally is always executed, no matter what your case is i.e
- try-catch-finally block
- throws
For unchecked exceptions, java does not mandate, error handling. this being the reason, if an unchecked exception occurs in finally block then and no handling is done for that, then code written below this point (where the error has occurred) will not be executed.
So I suggest to always handle all the exceptions may it be checked or unchecked. This way you can make sure that code block in finally is also executed no matter if unchecked exception also occurs. you have a place in sub-nest catch and Finally block to get your necessary work done.
The finally block always executes when the try block exits.unless you've System.exit(0) in your try or catch.
Yes. finally
block executes always except the case you call System.exit() because it stops Java VM.
Yes, Finally block will executes always but in your case if you do not handle the exception thrown in catch block your Application will stop without running the finally block.
You must have to handle the catch exception also. Let me know if you want more information.
精彩评论