web-dev-qa-db-fra.com

Les constructeurs peuvent-ils lancer des exceptions en Java?

Les constructeurs sont-ils autorisés à lancer des exceptions?

220
Mahmoud Hossam

Oui, les constructeurs peuvent lancer des exceptions. Cela signifie généralement que le nouvel objet est immédiatement éligible pour le ramassage des ordures (bien qu'il puisse ne pas être collecté avant un certain temps, bien sûr). Il est toutefois possible que l’objet "semi-construit" reste en place s’il est rendu visible plus tôt dans le constructeur (par exemple, en affectant un champ statique ou en s’ajoutant à une collection).

Une chose à laquelle il faut faire attention quand on lance des exceptions dans le constructeur: parce que l'appelant (généralement) n'aura aucun moyen d'utiliser le nouvel objet, le constructeur doit veiller à ne pas acquérir des ressources non gérées (descripteurs de fichier, etc.) puis à lancer une exception. sans les relâcher. Par exemple, si le constructeur essaie d'ouvrir FileInputStream et FileOutputStream, et que le premier réussit mais que le second échoue, vous devez essayer de fermer le premier flux. Cela devient plus difficile s'il s'agit d'un constructeur de sous-classe qui lève l'exception, bien sûr ... tout cela devient un peu délicat. Ce n'est pas un problème très souvent, mais cela vaut la peine d'être considéré.

348
Jon Skeet

Oui, ils peuvent lancer des exceptions. Si tel est le cas, ils ne seront que partiellement initialisés et, s'ils ne sont pas définitifs, peuvent être attaqués.

Ce qui suit est tiré du Secure Coding Guidelines 2. .

Les instances partiellement initialisées d'une classe non finale sont accessibles via une attaque de finaliseur. L'attaquant substitue la méthode de finalisation protégée dans une sous-classe et tente de créer une nouvelle instance de cette sous-classe. Cette tentative échoue (dans l'exemple ci-dessus, la vérification SecurityManager dans le constructeur de ClassLoader lève une exception de sécurité), mais l'attaquant ignore simplement toute exception et attend que la machine virtuelle procède à la finalisation de l'objet partiellement initialisé. Lorsque cela se produit, l’implémentation de la méthode de finalisation malveillante est invoquée, donnant à l’attaquant un accès à celle-ci, une référence à l’objet en cours de finalisation. Bien que l'objet ne soit que partiellement initialisé, l'attaquant peut toujours invoquer des méthodes dessus (contournant ainsi la vérification SecurityManager).

78
Billy Bob Bain

Absolument.

Si le constructeur ne reçoit pas une entrée valide ou ne peut pas construire l'objet de manière valide, il n'a d'autre option que de lever une exception et d'alerter son appelant.

33
Yuval

Oui, il peut générer une exception et vous pouvez également le déclarer dans la signature du constructeur, comme indiqué dans l'exemple ci-dessous:

public class ConstructorTest
{
    public ConstructorTest() throws InterruptedException
    {
        System.out.println("Preparing object....");
        Thread.sleep(1000);
        System.out.println("Object ready");
    }

    public static void main(String ... args)
    {
        try
        {
            ConstructorTest test = new ConstructorTest();
        }
        catch (InterruptedException e)
        {
            System.out.println("Got interrupted...");
        }
    }
}
14
V_Singh

Oui, les constructeurs sont autorisés à lancer des exceptions.

Cependant, soyez très sage en choisissant quelles exceptions ils devraient être - des exceptions cochées ou non contrôlées. Les exceptions non contrôlées sont essentiellement des sous-classes de RuntimeException.

Dans presque tous les cas (je ne pouvais pas proposer d'exception à ce cas), vous devrez lever une exception cochée. La raison en est que les exceptions non vérifiées (comme NullPointerException) sont normalement dues à des erreurs de programmation (telles que la non validation suffisante des entrées).

L'avantage qu'une exception vérifiée offre est que le programmeur est obligé de capturer l'exception dans son code d'instanciation, ce qui lui permet de réaliser qu'il peut y avoir un échec lors de la création de l'instance d'objet. Bien entendu, seule une révision du code permettra de détecter la faible pratique de programmation consistant à avaler une exception.

11
Vineet Reynolds

Oui.

Les constructeurs ne sont que des méthodes spéciales et peuvent générer des exceptions comme toute autre méthode.

7
Isaac