Problemas versiones Jasper vs IReport
Cuando se esté trabajando con reportes con el diseñador de iReport y JasperReport se debe asegurar que la versión con la cual se compile los reportes debe ser la misma de la librería cargada en su proyecto web; es decir, si se creo los reportes con la versión 3.7.4 de iReport se tiene que cargar la librería 3.7.4 de JasperReport para evitar que se produzca la siguiente error:
net.sf.jasperreports.engine.JRRuntimeException: Unknown hyperlink target 0
Manejo de Exceptions
Una exception es un indicador de un problema(error) que ocurre durante la ejecución de un programa, interrumpiendo el flujo normal de ejecución del mismo. El manejo de exceptions permite crear aplicaciones que permitan controlar estos errores, permitiendo en muchos de los casos que la aplicación continué funcionando a pesar de que se haya producido una exception.
Se debe tener en cuenta que existen varios tipos de error entre los cuales podemos citar:
- Checked Exceptions.- Son el tipo de exceptions que pueden ser controladas y anticipadas. En el api de java existen un conjunto de clases que para poder utilizarse se debe controlar las exceptions, nos referimos a estas.
- Error.- Son exceptions provocadas por condiciones externas en las cuales la aplicación no puede anticiparse y recuperarse de ella. Por ejemplo : apagones, daños de hardware.
- Runtime Exceptions.- Son exceptions provocadas por inconsistencias en código en la aplicación conocidos como bugs
Existen varias formas de controlar una exception, para poder ejemplificarlas junto con su utilización se basará en una aplicación de operaciones aritméticas con enteros en donde se pasarán dos argumentos a varios métodos. Los detalles se muestran a continuación:
Se definió dos clases: una clase llamada AritmeticaPrimitivos.java la cual tiene las cuatro operaciones aritméticas fundamentales: suma, resta, multiplicación y división pero sin ningún control de errores y otra clase llamada TestAritmeticaPrimitivos.java la cual permitirá probar las operaciones en primera instancia.
AritmeticaPrimitivos.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.matoosfe.sysinv.exception; /** * Clase que permite realizar un conjunto * de operaciones matemáticas * @author martosfre * @see www.matoosfe.com * 09/04/2012 */ public class AritmeticaPrimitivos { private int resultado; /** * Método para sumar dos números enteros * @param a * @param b * @return */ public int sumar(int a, int b){ resultado = a + b; return resultado; } /** * Método para restar dos números enteros * @param a * @param b * @return */ public int restar(int a, int b){ resultado = a - b; return resultado; } /** * Método para multiplicar dos números enteros * @param a * @param b * @return */ public int multiplicar(int a, int b){ resultado = a * b; return resultado; } /** * Método para dividir dos números enteros. * @param a * @param b * @return */ public int dividir(int a, int b){ resultado = a / b; return resultado; } } |
TestAritmeticaPrimitivos.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package com.matoosfe.sysinv.exception; /** * Clase para probar las diferentes operaciones * aritméticas de primitivos * @author martosfre * @see www.matoosfe.com * 09/04/2012 */ public class TestAritmeticaPrimitivos { public static void main(String[] args) { int numeroA = 30; int numeroB = 17; AritmeticaPrimitivos ariPri = new AritmeticaPrimitivos(); System.out.println("Resultado Suma:" + ariPri.sumar(numeroA, numeroB)); System.out.println("Resultado Resta:" + ariPri.restar(numeroA, numeroB)); System.out.println("Resultado Multiplicación:" + ariPri.multiplicar(numeroA, numeroB)); System.out.println("Resultado División:" + ariPri.dividir(numeroA, numeroB)); } } |
Una vez definido las clases y realizada la ejecución con valores mayores a 0, en este caso 30, 17 se obtiene los resultados sin ningún problema, como se muestra en la figura a continuación:
Figura 1.1: Corrida Satisfactoria
Pero que pasaría si se ingresa en el segundo valor en vez de 30 el número 0 , en ese caso la aplicación se detendrá su ejecución debido a que no existe la división para cero provocando la exception ArithmeticException como se muestra en la figura a continuación:
Para evitar esto se debe controlar las exceptions con alguno de las formas que describiremos en el siguiente bloque:
Bloque try/catch/finally.- Utilizado para controlar las exceptions en nivel primario; es decir, los métodos que directamente interaccionen con la aplicación (clases colocadas en la capa de vista) deberían utilizar esta forma de Control ya que son los que emitirán el mensaje al usuario final. Este forma de control tiene tres bloques:
- try.- Aquí se colocará todos el código que podría provocar un error incluido la llamada a otros métodos. Solo puede existir un bloque try.
- catch.- Este bloque se utiliza para controlar las diferentes exceptions que podrían presentarse en el bloque try. Pudiendo colocar tantos catch como errores se necesiten controlar o un solo catch con la clase principal Exception.
- finally.- Este bloque es opcional y se utiliza en la mayoría de los casos para ejecutar algún proceso como generación de log, liberación de recursos debido a que es un bloque que se ejecuta existe o no error.
Para mostrar este tipo de control se ha creado un método nuevo llamado dividirTryCatch(int a, int b):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /** * Método para divir dos números enteros * utilizando el control de errores a travéz * del bloque try/catch * @param a * @param b * @return */ public int dividirTryCatch(int a, int b){ try { resultado = a / b; } catch (ArithmeticException e) { System.err.println("Error:No existe la división para cero"); }finally{ System.out.println("Proceso controlado correctamene"); } return resultado; } |
Para poder ejecutarle se deberá realizar un cambio en la clase TestAritmeticaPrimitivos.java llamando al método creado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.matoosfe.sysinv.exception; /** * Clase para probar las diferentes operaciones * aritméticas de primitivos * @author martosfre * @see www.matoosfe.com * 09/04/2012 */ public class TestAritmeticaPrimitivos { public static void main(String[] args) { int numeroA = 30; int numeroB = 0; AritmeticaPrimitivos ariPri = new AritmeticaPrimitivos(); System.out.println("Resultado Suma:" + ariPri.sumar(numeroA, numeroB)); System.out.println("Resultado Resta:" + ariPri.restar(numeroA, numeroB)); System.out.println("Resultado Multiplicación:" + ariPri.multiplicar(numeroA, numeroB)); System.out.println("Resultado División:" + ariPri .dividirTryCatch(numeroA, numeroB)); } } |
Posterior a esto la aplicación se ejecutará con el control respectivo, como se muestra en la figura a continuación:
Figura 1.3: Corrida Satisfactoria Try/Catch
Sentencia Throws.- Debido a que los métodos pueden tener una jerarquía de llamado; es decir, son llamados desde otros métodos y asi sucesivamente existe la posibilidad de pasar el manejo del error al método principal que está llamando al método secundario evitando de esta manera redundar el control de las exceptions. Para esto se utiliza la sentencia throws para pasar el control del error a un método superior o primario.
Sentencia Throw.- Este sentencia es utilizadas para lanzar una exception ya sea personalizada o de Java en caso de presentarse algún resultado que dentro de la lógica de aplicación de negocio representa un error. Se diferencia de las demás porque forma parte de la lógica de programación que permite anticiparse al error, va siempre acompañada por la sentencia throws.
Para mostrar las dos formas de controlar una exception ya sea con la sentencia throws y throw se ha modificado el método dividir incluyendo un control que verifique el número ingresado como dividendo no sea cero, caso contrario se lanzará la exception ArithmeticException la cual deberá ser controlada por un try/catch en el método principal en este caso en el main.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * Método para dividir dos números enteros. * @param a * @param b * @return */ public int dividir(int a, int b) throws ArithmeticException{ if(b == 0){ throw new ArithmeticException("Error:No existe la división para cero"); }else{ resultado = a / b; } return resultado; } |
Para poder ejecutarle se deberá realizar un cambio en la clase TestAritmeticaPrimitivos.java llamando al método creado y incluyendo el bloque try/catch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.matoosfe.sysinv.exception; /** * Clase para probar las diferentes operaciones * aritméticas de primitivos * @author martosfre * @see www.matoosfe.com * 09/04/2012 */ public class TestAritmeticaPrimitivos { public static void main(String[] args) { int numeroA = 30; int numeroB = 0; try { AritmeticaPrimitivos ariPri = new AritmeticaPrimitivos(); System.out.println("Resultado Suma:" + ariPri.sumar(numeroA, numeroB)); System.out.println("Resultado Resta:" + ariPri.restar(numeroA, numeroB)); System.out.println("Resultado Multiplicación:" + ariPri.multiplicar(numeroA, numeroB)); System.out.println("Resultado División:" + ariPri .dividir(numeroA, numeroB)); } catch (ArithmeticException e) { System.err.println(e.getMessage()); } } } |
Posterior a esto la aplicación se ejecutará con el control respectivo, como se muestra en la figura a continuación:
Split con .
Estimados amig@s
Al utilizar el método split sobre una cadena para obtener el conjunto de valores por una ocurrencia me tope con el problema que al utilizar el caracter “.” no funcionaba. Al analizar el método se comprobó que debido a que el método utiliza una expresión regular regex para buscar la ocurrencia no se podia hacerlo normalmente por que el . es utilizado como un delimitador; se tuvo que añadir el caracter de escape \\
Forma Normal – Incorrecta
Forma Correcta
Dependencia Proyectos GWT
Cuando se está realizando proyectos con GWT (Google Web Toolkit) muchas veces es necesario integrarlo con otros proyectos que estén en otras tecnologías a lo cual si se utiliza los IDE’s ya sea en Eclipse, JDeveloper se presenta el siguiente problema en cuanto a la utilización del parser de XML. El problema es el siguiente:
1 2 3 4 | [ERROR] Failure while parsing XML org.xml.sax.SAXNotRecognizedException: http://apache.org/xml/features/nonvalidating/load-external-dtd at oracle.xml.jaxp.JXSAXParserFactory.setFeature ...... |
Para corregirlo se debe cargar los jars de los proyectos en cuestión no referenciar los proyectos directamente desde el IDE o en su defecto configurar la salida de los otros proyectos al WEB-INF/classes del proyecto de GWT.
Saludos



