Exceptions y JDK 1.3

Yo soy el primero al que le encantaría el poder utilizar las características de la versión 1.5 de Java, en concreto encuentro muy útiles los static imports y los generics, y por supuesto las annotations. Sin embargo, durante mi carrera, y por diversas razones, me he encontrado en situaciones de no poder utilizar siquiera la versión 1.4 del JDK. Es triste, pero cierto, y me temo que es muy habitual encontrarse con la restricción tan temida de: “Tenemos que programar contra el JDK 1.3“. Es algo así como una especie de maldición, cuando estás habituado a utilizar los métodos de la clase String añadidos a partir de la versión 1.4 –replaceAll(), split(), etc-, o la facilidad de la exception chaining. Por fortuna, el proyecto Commons de la fundación Apache puede ayudarnos a solventar algunos de esos obstáculos. Vayamos con la exception chaining. Esta es la interfaz de la clase java.lang.RuntimeException* en la versión 1.4:

public RuntimeException()
public RuntimeException(String message)
public RuntimeException(String message, Throwable cause)
public RuntimeException(Throwable cause)

Como se puede observar, dos de los constructores de esta clase admiten un argumento java.lang.Throwable, por tanto cuando usemos esta clase en la versión 1.4 no perderemos la traza de llamadas de las excepciones. Ahora veamos las signaturas de los constructores de esta misma clase en la versión 1.3:

public RuntimeException()
public RuntimeException(String message)

Ahora ya sabemos que la exception chaining fue un añadido a la versión 1.4 del JDK a la clase RuntimeException. En el subproyecto Commons Lang existe una jerarquía de clases que nos ayudan a establecer una pila de llamadas previa en el constructor de una excepción. En concreto, son las clases NestableRuntimeException y NestableException del paquete org.apache.commons.lang.exception:

Jakarta Commons Exception Hierarchy

Estos son los constructores de la clase NestableRuntimeException:

public NestableRuntimeException()
public NestableRuntimeException(String message)
public NestableRuntimeException(String message, Throwable cause)
public NestableRuntimeException(Throwable cause)

Equivalentes a los de la clase RuntimeException, de forma que funciona como tal y además mantiene una referencia a un objeto Throwable, con lo que simulamos la funcionalidad añadida a la versión 1.4 pero en un entorno compilado para la 1.3. Ahora simplemente podremos definir nuestras propias subclases de NestableRuntimeException o NestableException, sin miedo a que obtengamos errores de compilación debido al overriding de los constructores no existentes en la 1.3, pero sí en la 1.4. Ahora que lo digo, yo he sufrido dichos errores debido a que en mi IDE (Eclipse normalmente) no configuro el proyecto para compilar las fuentes contra la 1.3 (cuando ha de desplegarse en un entorno de JDK 1.3, claro). Aunque ya voy aprendiendo. Considero siempre una buena práctica configurar el entorno de desarrollo a semejanza del entorno destino, en la medida de lo posible.

* También se aplica a la clase java.lang.Exception

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: