web-dev-qa-db-fra.com

Différence entre "lever une nouvelle exception" et "nouvelle exception"?

Je suis intéressé à connaître les meilleures pratiques pour utiliser throw new Exception() et new Exception(). En cas d'utilisation de new Exception(), j'ai vu que le code passe à l'instruction suivante au lieu de lever l'exception.

Mais on me dit que nous devrions utiliser new Exception() pour lancer RuntimeException.

Quelqu'un peut-il éclairer cela?

6
Vineet Setia

new Exception() signifie créer une instance (identique à la création d'un nouvel Integer (...)) mais aucune exception ne se produira tant que vous ne la lancerez pas ...

Envisagez l'extrait suivant:

public static void main(String[] args) throws Exception {
    foo(1);
    foo2(1);
    }

    private static void foo2(final int number) throws Exception {
    Exception ex;
    if (number < 0) {
        ex = new Exception("No negative number please!");
        // throw ex; //nothing happens until you throw it
    }

    }

    private static void foo(final int number) throws Exception {
    if (number < 0) {
        throw new Exception("No negative number please!");
    }

    }

la méthode foo () LANCERA une exception si le paramètre est négatif mais la méthode foo2 () créera une instance d'exception si le paramètre est négatif

Exception e = new Exception ();

Crée simplement une nouvelle exception, que vous pourrez ensuite lancer. En utilisant

throw e;

Tandis que

throw new Exception()

Crée et lève l'exception sur une seule ligne

Pour créer et lever une exception d'exécution

throw new RuntimeException()
2
Daniel Scott

new Exception() signifie que vous créez une nouvelle instance de type Exception. Ce qui signifie que vous instanciez simplement un objet similaire à d'autres comme new String("abc"). Vous feriez cela lorsque vous êtes sur le point de lever une exception de type Exception dans les prochaines lignes d'exécution de code.

Alors que lorsque vous dites throw new Exception() cela signifie que vous dites déplacer le contrôle de programme vers l'appelant et ne pas exécuter les instructions supplémentaires après cette instruction throw.

Vous feriez cela dans une situation où vous constatez qu'il n'y a aucun moyen d'aller de l'avant et d'exécuter plus loin et donc de faire savoir à l'appelant que je ne peux pas gérer ce cas et si vous savez comment gérer ce cas, veuillez le faire.

Il n'y a pas de meilleure pratique en tant que telle lorsque vous comparez des oranges avec des pommes. Mais souvenez-vous que lorsque vous lancez une exception, vous lancez toujours une exception significative comme IO a où si le fichier n'est pas présent, il jette FileNotFoundException au lieu de son parent IOException.

1
SMA