Asserts en Java
En los lenguajes orientados a objeto, la gestión de los errores se realiza a
través de excepciones.
Existen dos familias de expciones:
- Lo errores: Problemas graves que se pueden dar y que no merece la pena
controlar (falta de memoria, error de comunicaciones, etc) - Las excepciones en si mismas que son predecibles y que de un modo
razonable podemos (y debemos controlar).
Java esta en continua evolución y a partir de la versión 1.4 se ha
introducido el concepto de asserts.
Un assert es una condición que se debe dar en un programa para que no se
produczca un error.
La gracia que tiene es que son una mezcla de los dos tipos vistos
anteriormente: Pueden suspender la ejecución de un programa pero no estamos
obligados a controlarlar (declararlas y capturar su posible ejecución).
Además, en tiempo de ejecución podemos definir si queremos evaluarlas o
no….
Vamos a introducirlas en un programa y verificar su uso.
Creamos una clase normal
class misassert { public static void main(String [] main) { int i = 10; assert i> 100; System.out.println(«Este es mi ejemplo»); |
Si compilamos, nos da un error:
Para pocer compilar necesitamos especificar que trabajamos con la versión
1.4
javac -source 1.4 *.java
Ejecución
Si ahora ejecutamos nuestra clase, veremos que no tiene en cuanta el assert
Para que lo considere hay que utilizar un parámetro nuevo: -ea
Mensajes adicionales
Podemos pones un mensaje:
assert i> 100 : La variable i esta fuera de
rango ;
C:\java>java -ea misassert Exception in thread «main» java.lang.AssertionError: La variable i esta fuera de rango at misassert.main(misassert.java:7) C:\java> |
En mensaje es una expresión por lo que podría llamarse a una función… en
nuestro caso podría mostrar los mensajes en función del idioma seleccionado
class misassert { public static void main(String [] main) { int i = 10; assert i > 100 : mensajeError(); System.out.println("Este es mi ejemplo"); } public static String mensajeError() { // montaje de error internacionalizado return "La variable está fuera de rango"; } } |
Si ahora decompilamos el código vamos que el compilador ha echo cosas por
nosotros…. y nuestro código es más pesado
// Decompiled by DJ v3.5.5.77 Copyright 2003 Atanas Neshkov Date: 30/01/2004 19:30:08 // Home Page : http://members.fortunecity.com/neshkov/dj.html - Check often for new version! // Decompiler options: packimports(3) // Source File Name: misassert.java import java.io.PrintStream; class misassert { misassert() { } public static void main(String args[]) { byte byte0 = 10; if(!$assertionsDisabled && byte0 <= 100) { throw new AssertionError(mensajeError()); } else { System.out.println("Este es mi ejemplo"); return; } } public static String mensajeError() { return "La variable esta fuera de rango"; } static Class _mthclass$(String s) { return Class.forName(s); ClassNotFoundException classnotfoundexception; classnotfoundexception; throw new NoClassDefFoundError(classnotfoundexception.getMessage()); } static final boolean $assertionsDisabled; /* synthetic field */ static { $assertionsDisabled = !(misassert.class).desiredAssertionStatus(); } } |
Podemos utilizar en nuestro programa la misma sintaxis directamente::
throw new
AssertionError(mensajeError());
Los asserts son una buena técnica para programas pre y post condiciones….
la programación por contrato….