salida - ¿Pueden los constructores lanzar excepciones en Java?
throws java (8)
¿Se les permite a los constructores lanzar excepciones?
Absolutamente.
Si el constructor no recibe una entrada válida, o no puede construir el objeto de una manera válida, no tiene otra opción que lanzar una excepción y alertar a su interlocutor.
Sí, los constructores tienen permitido lanzar excepciones.
Sin embargo, sea muy sabio al elegir las excepciones que deben ser: verificadas excepciones o sin marcar. Las excepciones no verificadas son básicamente subclases de RuntimeException.
En casi todos los casos (no se me ocurrió una excepción a este caso), tendrá que lanzar una excepción marcada. La razón es que las excepciones no verificadas (como NullPointerException) normalmente se deben a errores de programación (como no validar las entradas lo suficiente).
La ventaja que ofrece una excepción comprobada es que el programador se ve obligado a detectar la excepción en su código de creación de instancias y, por lo tanto, se da cuenta de que no se puede crear la instancia del objeto. Por supuesto, solo una revisión del código detectará la mala práctica de programación de tragar una excepción.
Sí, puede lanzar una excepción y 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í, pueden lanzar excepciones. Si es así, solo se inicializarán parcialmente y si no son definitivos, estarán sujetos a ataques.
Lo siguiente es de las Pautas de codificación segura 2.0 .
Se puede acceder a las instancias parcialmente inicializadas de una clase no final a través de un ataque finalizador. El atacante anula el método de finalización protegido en una subclase e intenta crear una nueva instancia de esa subclase. Este intento falla (en el ejemplo anterior, la comprobación de SecurityManager en el constructor de ClassLoader produce una excepción de seguridad), pero el atacante simplemente ignora cualquier excepción y espera que la máquina virtual realice la finalización en el objeto parcialmente inicializado. Cuando esto ocurre, se invoca la implementación del método de finalización malintencionada, lo que le otorga al atacante acceso a esta, una referencia al objeto que se está finalizando. Aunque el objeto solo está inicializado parcialmente, el atacante aún puede invocar métodos en él (por lo tanto, eludiendo la comprobación de SecurityManager).
Sí.
Los constructores no son más que métodos especiales, y pueden lanzar excepciones como cualquier otro método.
Un constructor puede lanzar cualquier excepción. Pero si cualquier constructor de subclase llama a un constructor de superclase que lanza una excepción, entonces el constructor de subclase debe capturar la excepción o lanzarla.
sí puede lanzar una excepción como lo hace otro método
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, por supuesto, no se puede recolectar durante algún tiempo). Sin embargo, es posible que el objeto "a medio construir" se quede, si se hace visible anteriormente en el constructor (por ejemplo, asignando un campo estático o agregándose a una colección).
Una cosa es tener cuidado al lanzar excepciones en el constructor: dado que la persona que llama (generalmente) no tendrá forma de usar el nuevo objeto, el constructor debe tener cuidado de evitar la adquisición de recursos no administrados (identificadores de archivos, etc.) y luego lanzar una excepción. Sin soltarlos. Por ejemplo, si el constructor intenta abrir un FileInputStream
y un FileOutputStream
, y el primero tiene éxito pero el segundo falla, debe intentar cerrar la primera secuencia. Esto se vuelve más difícil si es un constructor de subclases 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.