web-dev-qa-db-fra.com

Qu'est-ce que cela signifie quand la méthode principale lève une exception?

Je suis en train de passer en revue un examen de préparation à mon examen final de demain matin. Je me suis trompé de question, mais aucune réponse correcte n'a été signalée et j'ai omis de demander au prof à ce sujet.

Considérez l'extrait de code suivant:

public static void main(String[] args) throws FileNotFoundException

Lequel des énoncés suivants concernant ce code est correct?

  1. La méthode principale est conçue pour intercepter et gérer tous les types d'exceptions.
  2. La méthode principale est conçue pour attraper et gérer la FileNotFoundException.
  3. La méthode principale devrait simplement se terminer si la FileNotFoundException se produit.
  4. La méthode principale devrait simplement se terminer si une exception se produit.

J'avais choisi la deuxième option.

28
agent154

La réponse est le numéro 4, 

4.- La méthode principale devrait simplement se terminer si une exception se produisait.

La clause throws indique uniquement que la méthode lève une exception FileNotFoundException vérifiée et que la méthode appelante doit l'attraper ou le renvoyer. Si une exception non cochée est levée (et non attrapée) dans la méthode principale, elle se terminera également.

Vérifiez ce test:

public class ExceptionThrownTest {

    @Test
    public void testingExceptions() {

        try {
            ExceptionThrownTest.main(new String[] {});
        } catch (Throwable e) {
            assertTrue(e instanceof RuntimeException);
        }

    }

    public static void main(String[] args) throws FileNotFoundException {

        dangerousMethod();

        // Won't be executed because RuntimeException thrown
        unreachableMethod();

    }

    private static void dangerousMethod() {
        throw new RuntimeException();
    }

    private static void unreachableMethod() {
        System.out.println("Won't execute");
    }
}

Comme vous pouvez le constater, si je lance une RuntimeException, la méthode se terminera même si l’exception levée n’est pas une FileNotFoundException

17
ElderMael

Mec, un peu en retard, mais la réponse est le numéro 3.

Le numéro 1 est faux car il ne traite pas FileNotFoundException

Le numéro 2 est faux pour la même raison.

Le numéro 3 est vrai. Si une exception FileNotFoundException est levée, la méthode principale se terminera.

Le numéro 4 est faux. Il ne se terminerait pas en cas de n'importe quelle exception. Il ne se terminerait que dans le cas d'une exception non contrôlée ou de FileNotFoundException. S'il n'y a pas d'autres exceptions vérifiées déclarées dans la clause 'throws', cela signifie qu'elles sont traitées dans la méthode.

9
MartinV

La méthode principale n'attrape aucune exception, elle gère plutôt la FileNotFoundException en la lançant vers la source qui a appelé la méthode principale.

Le moteur d'exécution lance les classes JVM, une classe spécifique parmi les classes JVM appelle la méthode main.

Le traitement de la variable throws de la méthode principale est à la merci des classes de la machine virtuelle Java dans ce cas.

  • Vous pouvez en savoir plus à ce sujet dans la spécification du langage Java fournie par Oracle.
  • De plus, vous pouvez afficher le code source de certaines des machines virtuelles disponibles, en empruntant ce chemin, mais en vous éloignant d'autres langages de programmation, OpenJdk .

J'ai pensé partager ma petite croûte de recherche humiliée sur ce sujet, j'espère que cela aidera les curieux :)

4
E_X

Je suis d’accord avec d’autres réponses pour dire que la bonne réponse à la question est l’option 3. L’option 4 indique: 

  1. La méthode principale devrait simplement se terminer si une exception se produit.

Notez le "tout" dans cette option. Voici un exemple de code dans lequel une exception se produit, mais main() ne se termine pas:

public static void main(String[] args) throws FileNotFoundException {
    try {
        methodThatThrowsACheckedException();
    } catch (SomeCheckedException e) {
        // do something to handle this exception
    }
}

Une exception se produit dans ce code, mais la méthode ne se termine pas car elle a été configurée pour gérer cette exception. Si l'exception était une UncheckedException non capturée, alors la méthode se terminerait, bien sûr. Le point de l'option 4, cependant, est que tout contre-exemple l'invalide, car il dit qu'une exception "tout" se produit.

L'option 3, cependant, limite cette terminaison à ne se produire que lorsque l'exception de la signature de la méthode est levée:

  1. La méthode principale devrait simplement se terminer si la FileNotFoundException se produit.

La raison pour laquelle l'option 3 a plus de sens est que le code comme celui-ci n'a pas de sens en pratique:

public static void main(String[] args) throws FileNotFoundException {
    try {
        methodThatThrowsFileNotFoundException();
    } catch (FileNotFoundException e) {
        // do something to handle this exception
    }
}

Cela n'a pas beaucoup de sens de déclarer qu'une méthode lève une exception, mais attrapez cette exception dans la méthode (sauf si vous la relancez après avoir fait quelque chose, auquel cas l'option 3 est toujours valable car la méthode se termine ).

1
ryoung10

Avec seulement la déclaration de main(), il est impossible de dire quelle réponse est objectivement correcte. N'importe laquelle des déclarations pourrait être vraie, selon la définition de la méthode.

  1. La méthode principale est conçue pour intercepter et gérer tous les types d'exceptions.

  2. La méthode principale est conçue pour attraper et gérer le FileNotFoundException.

Les deux déclarations ci-dessus sont vraies de ce qui suit:

public static void main(String[] args) throws FileNotFoundException {
    while (true) {
        try {
            doSomething();
        }
        catch (Exception e) {}
    }
}

L'exception déclarée n'est jamais levée par main(), mais il ne s'agit pas d'une erreur. juste inutile et trompeur.

  1. La méthode principale devrait simplement se terminer si la FileNotFoundException se produit.

  2. La méthode principale devrait simplement se terminer si une exception se produit.

Les deux déclarations ci-dessus sont vraies de ce qui suit:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (Exception e) {
        return;
    }
} 

Bien entendu, nous pouvons deviner l’intention de la question sur la base de ce qu’un programmeur décent et raisonnable pourrait vouloir communiquer avec cette signature de méthode. Ce qui serait qu'ils ont l'intention de la méthode pour lancer FileNotFoundException, et gèrent nécessairement d'autres vérifiés Exceptions. Nous pouvons aussi raisonnablement supposer que "traitement" ne signifie pas seulement "processus", mais spécifiquement qu'il ne lancera pas une nouvelle exception.

Ces hypothèses excluent immédiatement les n ° 1 et n ° 2.

La question qui reste est de savoir si "mettre simplement fin" inclut le lancement d'une exception ou seulement un return/System.exit() explicite. Dans le premier cas, les n ° 3 et n ° 4 pourraient toujours être vrais:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (FileNotFoundException fnfe) {
        throw fnfe;
    }
    catch (Exception e) {
        return;
    }
}

Dans ce dernier cas, ni le n ° 3 ni le n ° 4 ne peuvent être vrais tout en satisfaisant l'hypothèse que main() jettera FileNotFoundException.


En résumé, les options ne sont pas bien formulées. Si je devais choisir une réponse, ce serait n ° 3 sur la base de la logique de la réponse de MartinV. Mon hypothèse serait que le mot "devrait" dans # 3 était un choix malheureux de la part du professeur, et que quelque chose comme "peut" aurait été une meilleure option. Il aurait également été judicieux d'utiliser un langage plus précis que "simplement terminer" (et, sans doute, "manipuler").

0
Matthew Read

La réponse est à la fois 2 et 3.

2.La méthode principale est conçue pour attraper et gérer la FileNotFoundException . 3.La méthode principale doit simplement se terminer si une exception FileNotFoundException se produit.

Mais si ne parvient pas à gérer l'exception même si elle est conçue pour le gérer et que les programmes sont arrêtés de manière anormale.

lance mots-clés est utilisé pour que JVM gère les exceptions que nous sommes paresseux à gérer, il compile avec succès mais affiche l'exception pendant l'exécution (si vous le gérez dans la méthode principale, il est compilé et exécuté avec succès).

4.La méthode principale devrait simplement se terminer si une exception se produisait ..__ n'est pas toujours correct car les exceptions qui se produisent peuvent être gérées dans la méthode principale.

1.La méthode principale est conçue pour détecter et gérer tous les types d'exceptions. Elle est incorrecte car la machine virtuelle Java ne gère pas les exceptions non contrôlées.

0
Jaswanth Gorthi