¿Puede el constructor devolver un objeto nulo?

Mientras miraba un código viejo, me encontré con esta joya:

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

La segunda línea está marcada en Eclipse como código muerto, y entiendo por qué. No parece haber una excepción explícitamente lanzada, y el constructor de MyObject no puede lanzar ningún tipo de excepción (como NullPointerException s).

Mi pregunta es por qué hay un cheque nulo? ¿Era posible anteriormente en una versión anterior de Java que un constructor devuelva nulo? ¿O es esto simplemente inútil y el código muerto?

El código está muerto en cualquier versión de Java. No es posible que un constructor devuelva null e incluso si se lanzara una excepción desde el constructor, no se invocará la siguiente línea.

No, nunca ha sido posible. Tal vez una versión anterior del código usó algún método de fábrica que podría devolver nulo:

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

De la sección 15.9.4 de JLS :

El valor de una expresión de creación de instancia de clase es una referencia al objeto recién creado de la clase especificada. Cada vez que se evalúa la expresión, se crea un objeto nuevo.

Entonces no, nunca puede regresar nulo.

Supongo que fue escrito por un progtwigdor de C que está acostumbrado a probar el valor de retorno de malloc() para NULL , malloc() puede devolver NULL si su sistema se queda sin memoria.

El código no tiene sentido en Java, ya que Java arrojará un OutOfMemoryError` si se queda sin memoria.

La respuesta es simple: la persona que escribió el código era un progtwigdor c ++ paranoico. En C ++, puede sobrecargar el operador nuevo y usarlo como un simple asignador de memoria (también conocido como malloc).