Uncatchable ChuckNorrisException
I haven't tried this, so I don't know if the JVM would restrict something like this, but maybe you could compile code which throws ChuckNorrisException
, but at runtime provide a class definition of ChuckNorrisException
which does not extend Throwable.
UPDATE:
It doesn't work. It generates a verifier error:
Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\in signature: ([Ljava/lang/String;)V) Can only throw Throwable objectsCould not find the main class: TestThrow. Program will exit.
UPDATE 2:
Actually, you can get this to work if you disable the byte code verifier! (-Xverify:none
)
UPDATE 3:
For those following from home, here is the full script:
Create the following classes:
public class ChuckNorrisException extends RuntimeException // <- Comment out this line on second compilation{ public ChuckNorrisException() { }}public class TestVillain { public static void main(String[] args) { try { throw new ChuckNorrisException(); } catch(Throwable t) { System.out.println("Gotcha!"); } finally { System.out.println("The end."); } }}
Compile classes:
javac -cp . TestVillain.java ChuckNorrisException.java
Run:
java -cp . TestVillainGotcha!The end.
Comment out "extends RuntimeException" and recompile ChuckNorrisException.java
only :
javac -cp . ChuckNorrisException.java
Run:
java -cp . TestVillainException in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objectsCould not find the main class: TestVillain. Program will exit.
Run without verification:
java -Xverify:none -cp . TestVillainThe end.Exception in thread "main"
After having pondered this, I have successfully created an uncatchable exception. I chose to name it JulesWinnfield
, however, rather than Chuck, because it is one mushroom-cloud-laying-mother-exception. Furthermore, it might not be exactly what you had in mind, but it certainly can't be caught. Observe:
public static class JulesWinnfield extends Exception{ JulesWinnfield() { System.err.println("Say 'What' again! I dare you! I double dare you!"); System.exit(25-17); // And you shall know I am the LORD }} public static void main(String[] args){ try { throw new JulesWinnfield(); } catch(JulesWinnfield jw) { System.out.println("There's a word for that Jules - a bum"); }}
Et voila! Uncaught exception.
Output:
run:
Say 'What' again! I dare you! I double dare you!
Java Result: 8
BUILD SUCCESSFUL (total time: 0 seconds)
When I have a little more time, I'll see if I can't come up with something else, as well.
Also, check this out:
public static class JulesWinnfield extends Exception{ JulesWinnfield() throws JulesWinnfield, VincentVega { throw new VincentVega(); }}public static class VincentVega extends Exception{ VincentVega() throws JulesWinnfield, VincentVega { throw new JulesWinnfield(); }}public static void main(String[] args) throws VincentVega{ try { throw new JulesWinnfield(); } catch(JulesWinnfield jw) { } catch(VincentVega vv) { }}
Causes a stack overflow - again, exceptions remain uncaught.
With such an exception it would obviously be mandatory to use a System.exit(Integer.MIN_VALUE);
from the constructor because this is what would happen if you threw such an exception ;)