We will use the following piece of code:
public class TryCatchFinallySystemExit { public static void main(String[] args) { System.setSecurityManager(new SecurityManager() { @Override public void checkPermission(Permission perm) { } @Override public void checkExit(int status) { // throw new SecurityException(); } }); System.out.println("Before Check"); check(); System.out.println("After Check"); } public static void check() { try { System.out.println("Before System.exit(-1)"); System.exit(-1); System.out.println("After System.exit(-1)"); } catch(Throwable t) { System.out.println("Before System.exit(-2)"); System.exit(-2); System.out.println("After System.exit(-2)"); } finally { System.out.println("Before System.exit(-3)"); System.exit(-3); System.out.println("After System.exit(-3)"); } System.out.println("After try statement"); } }
The main method implements a SecurityManager, then calls the check() method. If we run this application as is, the output is the following:
Before Check
Before System.exit(-1)
Before System.exit(-1)
We can conclude that:
- System.exit(-1) is the last statement excuted.
- Catch and Finally statements are not called.
- The check() method does not return.
If we uncomment the throw new SecurityException(); and execute the application again, we get:
Before Check
Before System.exit(-1)
Before System.exit(-2)
Before System.exit(-3)
Before System.exit(-1)
Before System.exit(-2)
Before System.exit(-3)
We can conclude that:
- The SecurityException get the catch and finally statements to be executed.
- Statements after System.exit() statements are not executed.
- The check() method does not return.
For return, continue and break statements in try statements, see this post.
Disclaimer: this post contains information from personal notes and information available on StackOverflow.com.
No comments:
Post a Comment