¿Pueden los constructores lanzar excepciones en Java?

¿Pueden los constructores lanzar excepciones?

Sí, los constructores pueden lanzar excepciones. Por lo general, esto significa que el nuevo objeto es inmediatamente elegible para la recolección de basura (aunque es posible que no se recopile durante un tiempo, por supuesto). Sin embargo, es posible que el objeto “a medio construir” se quede, si se ha hecho visible antes en el constructor (por ejemplo, asignando un campo estático o agregándose a una colección).

Una cosa a tener cuidado al lanzar excepciones en el constructor: debido a que el que llama (normalmente) no tendrá forma de usar el nuevo objeto, el constructor debe tener cuidado de evitar adquirir recursos no administrados (manejadores de archivos, etc.) y luego lanzar una excepción sin liberarlos. Por ejemplo, si el constructor intenta abrir un FileInputStream y un FileOutputStream , y el primero tiene éxito pero el segundo falla, debe intentar cerrar el primer flujo. Esto se vuelve más difícil si se trata de un constructor de subclase que lanza la excepción, por supuesto … todo se vuelve un poco complicado. No es un problema muy a menudo, pero vale la pena considerarlo.

Sí, pueden lanzar excepciones. De ser así, solo se inicializarán parcialmente y, si no son definitivas, estarán sujetas a ataque.

Lo siguiente es de Secure Coding Guidelines 2.0 .

Se puede acceder a instancias parcialmente inicializadas de una clase no final a través de un ataque de finalizador. El atacante anula el método de finalización protegido en una subclase e intenta crear una nueva instancia de esa subclase. Este bash falla (en el ejemplo anterior, la comprobación de SecurityManager en el constructor de ClassLoader arroja una excepción de seguridad), pero el atacante simplemente ignora cualquier excepción y espera a que la máquina virtual realice la finalización en el objeto parcialmente inicializado. Cuando eso ocurre, se invoca la implementación del método malicioso de finalización, lo que le da al atacante acceso a esto, una referencia al objeto que se está finalizando. Aunque el objeto solo se inicializó parcialmente, el atacante aún puede invocar métodos sobre él (lo que elude la comprobación de SecurityManager).

Absolutamente.

Si el constructor no recibe una entrada válida, o no puede construir el objeto de manera válida, no tiene otra opción que arrojar una excepción y alertar a su interlocutor.

Sí, puede arrojar una excepción y usted puede declarar eso en la firma del constructor también, como se muestra en el siguiente ejemplo:

 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..."); } } } 

Sí, los constructores pueden lanzar excepciones.

Sin embargo, sea muy inteligente al elegir las excepciones que deberían tener: verifique las excepciones o desmarque. Las excepciones no verificadas son básicamente subclases de RuntimeException.

En casi todos los casos (no pude encontrar una excepción a este caso), deberá lanzar una excepción marcada. La razón es que las excepciones sin marcar (como NullPointerException) normalmente se deben a errores de progtwigción (como no validar las entradas lo suficiente).

La ventaja que ofrece una excepción comprobada es que el progtwigdor se ve obligado a atrapar la excepción en su código de creación de instancias y, por lo tanto, se da cuenta de que puede haber una falla al crear la instancia del objeto. Por supuesto, solo una revisión de código detectará la práctica de progtwigción pobre de tragar una excepción.

Sí.

Los constructores no son más que métodos especiales, y pueden lanzar excepciones como cualquier otro método.

Un constructor PUEDE arrojar cualquier excepción. Pero si cualquier constructor de subclase llama a un constructor de superclase que arroja una excepción, entonces el constructor de la subclase debe atrapar la excepción o lanzarla.

sí, puede arrojar una excepción como lo hace otro método