web-dev-qa-db-fra.com

Java: exception appropriée pour l'erreur d'initialisation

Quelle exception dois-je lever lorsqu'une méthode d'usine statique ne parvient pas à initialiser un nouvel objet? Je préfère lever une exception significative plutôt que de renvoyer null.

32
Adam Matan

Si vous lancez une exception dans une usine en raison de données insuffisantes, j'aime lancer un IllegalStateException avec une description similaire à "ne peut pas construire X, aucun Y n'a été défini".

Si vous lancez une exception dans une usine en raison de données en conflit, j'aime lancer un IllegalStateException avec une description similaire à "ne peut pas construire X, Y est en conflit avec Z".

Si vous lancez une exception dans une Factory en raison d'une valeur incorrecte (ou absurde), j'aime lancer un IllegalArgumentException avec une description similaire à "Y ne peut pas être A".

Si vous lancez une exception dans une usine en raison d'une valeur manquante, j'aime lancer un IllegalArgumentException avec une description similaire à "Y ne peut pas être nul".

La dernière préférence dépend d'un débat. Certaines personnes suggèrent qu'il pourrait être préférable de lancer un NullPointerException; dans mon cas, nous les évitons à tout prix car de nombreux clients ont tendance à ne pas lire le message d'exception (et supposent que NullPointerException signifie une erreur de codage).

Dans tous les cas, vous devez fournir un bon message spécifique expliquant pourquoi l'exception a été levée, afin de réduire vos futurs coûts de support liés à la levée de cette exception dans quelques mois.

38
Edwin Buck

Oui, la cause du problème est votre meilleur choix. Si les arguments ne sont pas OK, vous pouvez lever IllegalArgumentException, si un fichier n'est pas là, vous pouvez lancer FileNotFoundException, si la fabrique n'est pas initialisée correctement, vous pouvez lever IllegalStateException, etc., etc ...

Cependant, créer votre propre exception est facile. Déclarez simplement votre classe comme extends Exception et ajoutez des constructeurs délégués. Si vous étendez Exception, cette méthode qui peut la lever doit être déclarée avec throws. Si vous ne le souhaitez pas, vous pouvez étendre RuntimeException, celles-ci n'ont pas besoin d'être déclarées.

2
Jakub Zaverka

Vous pouvez créer votre propre exception en étendant la classe Exception

2
Rahul Borkar

Quelque chose comme ça devrait probablement être un Assert, mais s'il y a en fait la possibilité que cela échoue, alors une exception personnalisée qui est significative pour vous serait mon choix.

2
Oscar Gomez

Idéalement, vous souhaitez étendre Exception et créer votre propre IntializatonException.

1
Nishant