Saltar al contenido

Programación con Aserciones en Java Parte 1

Empecemos con lo básico de cómo usar las afirmaciones.

Las afirmaciones utilizan la palabra clave de afirmación reservada. Tiene la siguiente sintaxis:

Programación con Aserciones en Java Parte 1
Programación con Aserciones en Java Parte 1
1assert booleanExpression;

java

Aquí hay un ejemplo:

123456789privadooublecalcularInterés(doble cantidad){asegurar la cantidad;0&& cantidad <=1_000;doble interés =0.0;// calcular el interésretorno de interés;}

java

Si la condición se evalúa como falsa, se lanzará una excepción del tipo java.lang.AssertionError.

Esto significa que el ejemplo anterior equivale a lo siguiente:

1234567891011privadooublecalcularInterés(doble cantidad){if(cantidad;0&& cantidad <1_000){thrownewAssertionError();}doble interés =0.0;// calcular interésretorno interés;}

java

Como habrán adivinado por su nombre, AssertionError es una subclase de Error:

¿Por qué AssertionError es una subclase de Error en lugar de RuntimeException?

Porque se supone que nosotros no debemos atrapar el error y sus subclases.

No tiene sentido tratar de recuperarse de los errores de afirmación. Un error de este tipo significaría que el programa no funciona en las condiciones que el programador supone que son verdaderas. Esto haría muy probable que la continuación de la ejecución conduzca a más errores en el futuro.

Así que el error hará que el programa se detenga y se imprimirá un rastro de la pila, por ejemplo:

123Excepción en el hilo "main" java.lang.AssertionError at com.example.AssertTest.calculateInterest(AssertTest.java:6) at com.example.AssertTest.main(AssertTest.java:16)

Eso puede no ser muy útil.

Sin embargo, una declaración de afirmación también puede tomar un mensaje:

1assert booleanExpression : "Mensaje sobre el error";

java

Por ejemplo, si la siguiente afirmación fracasa:

123456789privadooublecalcularInterés(doble cantidad){asegurar la cantidad;0&& cantidad;1_000: "La cantidad debe estar entre 0 y 1.000: "+ cantidad;// ...}

java

Algo como lo siguiente se imprimirá a la salida estándar:

123Excepción en el hilo "principal" java.lang.AssertionError: La cantidad debe estar entre 0 y 1.000: -11,0 en com.example.AssertTest.calculateInterest(AssertTest.java:6) en com.example.AssertTest.main(AssertTest.java:16)

Una vez más, el ejemplo anterior es equivalente a:

123456789if(amount >0&& amount <1_000){thrownewAssertionError("La cantidad debe estar entre 0 y 1.000: "+ cantidad );}// ...}

java

La mayoría de las veces, usará una cuerda, pero si se fijan en los constructores de AssertionError, verán que también puede tomar otros tipos que se convertirán en una cuerda:

12345678AssertionError(detalle booleanoMensaje)AssertionError(detalle charMensaje)AssertionError(detalle dobleMensaje)AssertionError(detalle flotanteMensaje)AssertionError(detalle intMensaje)AssertionError(detalle largoMensaje)AssertionError(detalle objetoMensaje)AssertionError(String message,Throwable cause)

java

Lo que significa que si eso es suficiente para ti, puedes usar algo como:

12345privadooublecalcularInterés(doble cantidad){asegurar la cantidad;0&& cantidad;1_000: cantidad;// ...}

java

Si la expresión booleana se evalúa como verdadera, no pasará nada.

Sin embargo, las afirmaciones no están habilitadas por defecto. Así que, incluso si la afirmación falla, si no ejecutas tu programa con una bandera especial, no pasará nada.

Las afirmaciones se habilitan con las banderas -ea o enableassertions:

123java -ea AssertTest// Orjava -enableassertions AssertTest

Esto permitiría hacer afirmaciones en todas las clases de nuestro programa excepto en las clases de Java (clases de sistema).

Si quieres habilitar las aserciones en las clases de Java, puedes usar las banderas -esa o enablesystemassertions:

123java -esa AssertTest// Orjava -enablesystemassertions AssertTest

También puede habilitar las afirmaciones para una sola clase:

1java -ea:com.example.MyOtherClass AssertTest

O en un paquete con un nombre específico y cualquiera de sus subpaquetes:

1java -ea:com.ejemplo... AssertTest

O en el paquete por defecto en el directorio de trabajo actual:

1java -ea:... AssertTest

También hay una opción para deshabilitar las afirmaciones:

123java -da AssertTest// Orjava -disableassertions AssertTest

Y la correspondiente opción de deshabilitar las afirmaciones en las clases de Java:

123java -dsa AssertTest// Orjava -disablesystemassertions AssertTest

Tal vez se pregunte, ¿por qué tenemos esta opción si las afirmaciones están desactivadas por defecto?

Bueno, puedes usar las mismas opciones de las banderas ea y esa para desactivar una sola clase o paquetes enteros.

Y también puedes combinarlos. Por ejemplo, puedes habilitar las aseveraciones en todas las clases del paquete com.example, excepto en la clase com.example.Utils:

1java -ea:com.ejemplo... -da:com.ejemplo.Utils AssertTest