77 votes

Java: Pouvez créer un objet "retour" d'une référence null?

Tout en regardant à travers certains vieux code, je suis tombé sur ce petit bijou:

MyObject o = new MyObject("parameter");
if (o == null) o = new MyObject("fallback parameter");

La deuxième ligne est marqué dans l'éclipse du code mort, et je comprends pourquoi. Aucune exception semble être explicitement jeté, et il n'est pas possible pour l' MyObject constructeur à lancer toute sorte d'exception (comme NullPointerExceptions).

Ma question est pourquoi cela est-il? C'était déjà possible dans une ancienne version de Java pour un constructeur de retourner la valeur null? Ou est-ce simplement inutile et code mort?

Merci!

100voto

tibtof Points 4492

Le code est morte dans n'importe quelle version de java. Il n'est pas possible pour un constructeur de revenir null et même si une exception sera levée à partir du constructeur, à la ligne suivante ne sera pas appelé.

54voto

JB Nizet Points 250258

Non, il n'a jamais été possible. Peut-être une version précédente du code utilisé une méthode de fabrique qui pourrait retourner la valeur null:

MyObject o = createMyObject("parameter");
if (o == null) o = createMyObject("fallback parameter");

52voto

Jon Skeet Points 692016

À partir de la section 15.9.4 de la JLS:

La valeur d'une instance de classe de la création de l'expression est une référence à l'objet nouvellement créé de la classe spécifiée. Chaque fois que l'expression est évaluée, un nouvel objet est créé.

Donc non, il ne peut jamais retourner la valeur null.

24voto

Jack Edmonds Points 10264

Ma conjecture est qu'il a été écrit par un programmeur C qui est utilisé pour tester la valeur de retour de l' malloc pour null. malloc peut renvoyer null si vous êtes à court de mémoire.

Le code ne fait pas de sens en Java et, depuis Java va jeter un OutOfMemoryError si elle est à court de mémoire.

8voto

tigran Points 1442

La réponse est simple: la personne qui a écrit le code était un paranoïaque programmeur c++. En C++, vous risquez de surcharger l'opérateur new et de l'utiliser comme un simple allocateur de mémoire (aka malloc).

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