lunes, 6 de junio de 2011

InstantiationException

En cuanto uno empieza a hacer cositas con reflexión en Java, es normal que se encuentre tarde o temprano con la excepción InstantiationException. Hasta la versión 1.5, el api de Java indicaba respecto a esta excepción algo así como:

Lanzada cuando una aplicación intenta crear una instancia de una clase utilizando el método newInstance de la clase Class, pero el objeto no puede ser instanciado porque es una interfaz o una clase abstracta.

Este mensaje tenía la habilidad de hacernos pensar que los especificados eran los únicos motivos que podían hacer que se lanzase esta excepción. Pero entonces, si estamos absolutamente seguros de que estamos intentando instanciar una clase no abstracta, ¿por qué me puede aparecer el error?

Pues por ejemplo, porque estés ejecutando algo así:

Object o = Class.forName("Clase").newInstance();

Y en la clase Clase no tengas explícitamente definido el constructor sin parámetros. Simplemente añadiéndolo a la definición de la clase solucionaremos entonces el problema.

Es por esto que a partir de la versión 6, el api de la clase InstantiationException ha cambiado su descripción a:

Lanzada cuando una aplicación intenta crear una instancia de una clase utilizando el método newInstance de la clase Class, pero el objeto no puede ser instanciado. La creación de la instancia puede fallar por varios motivos, incluyendo, pero no limitándolos a:

  • El objeto representa a una clase abstracta, una interfaz, un array, un tipo primitivo o void.
  • La clase no tiene constructor sin argumentos.
Mucho mejor.

1 comentario:

Cualquier aportación será bienvenida