593 votes

ChuckNorrisException inaccessible

Est-il possible de construire un extrait de code en Java qui ferait une hypothétique `` indétectable ?

Pensées qui viennent à l’esprit sont en utilisant par exemple intercepteurs ou la programmation orientée aspect.

312voto

jtahlborn Points 32515

Je n'ai pas essayé, donc je ne sais pas si la JVM et à restreindre quelque chose comme cela, mais peut-être que vous pouvez compiler le code qui jette ChuckNorrisException, mais au moment de l'exécution de fournir une définition de classe d' ChuckNorrisException qui ne s'étend pas à Lancer.

Mise à JOUR:

Il ne fonctionne pas. Il génère un vérificateur d'erreur:

Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\
in signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestThrow.  Program will exit.

Mise à JOUR 2:

En fait, vous pouvez obtenir que cela fonctionne si vous désactivez le code octet verifier! (-Xverify:none)

Mise à JOUR 3:

Pour ceux qui suivent de la maison, voici le script complet:

Créer les classes suivantes:

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.");
        }
    }
}

Compiler les classes:

javac -cp . TestVillain.java ChuckNorrisException.java

Exécuter:

java -cp . TestVillain
Gotcha!
The end.

Commentaire "extends RuntimeException" et recompiler ChuckNorrisException.java seulement :

javac -cp . ChuckNorrisException.java

Exécuter:

java -cp . TestVillain
Exception in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestVillain.  Program will exit.

Exécuter sans vérification:

java -Xverify:none -cp . TestVillain
The end.
Exception in thread "main"

118voto

mikeTheLiar Points 2093

Après avoir réfléchi à cela, j'ai créé avec succès une part insaisissable de l'exception. J'ai choisi de le nommer JulesWinnfield, cependant, plutôt que de Chuck, parce que c'est un champignon-cloud-maçonnerie-mère-exception à la règle. En outre, il pourrait ne pas être exactement ce que vous aviez à l'esprit, mais il ne peut certainement pas être pris. Observer:

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! Exception non interceptée.

Sortie:

exécuter:

Dire "Quoi" encore une fois! Je vous l'osez! Je double osez-vous!

Java Résultat: 8

Construction RÉUSSIE (temps total: 0 secondes)

Quand j'ai un peu plus de temps, je vais voir si je peux pas venir avec quelque chose d'autre, que de bien.

Aussi, vérifiez ceci:

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

    }
}

Provoque un débordement de pile - là encore, les exceptions restent non interceptée.

85voto

Korgen Points 2496

Avec une telle exception il serait évidemment obligatoire d’utiliser un `` du constructeur, parce que c’est ce qui se passerait si vous avez jeté une telle exception  ;)

46voto

Nathan Hughes Points 30377

Tout code peut intercepter Throwable. Donc non, quelque exception vous créez va être une sous-classe de Throwable et faire l’objet d’être pris.

35voto

fluffy Points 1915
<pre><code></code><p><em>techniquement</em> <code></code> ne peut pas être levée--il vous jette en premier.)</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X