Uncatchable ChuckNorrisException Uncatchable ChuckNorrisException java java

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 ;)