Aserciones de Java (declaración de aserción)

En este tutorial, aprenderemos sobre la declaración de aserción de Java (aserciones de Java) con la ayuda de ejemplos.

Las afirmaciones en Java ayudan a detectar errores probando el código que asumimos es verdadero.

Se hace una afirmación utilizando la assertpalabra clave.

Su sintaxis es:

 assert condition;

Aquí, conditionhay una expresión booleana que asumimos que es verdadera cuando se ejecuta el programa.

Habilitación de afirmaciones

De forma predeterminada, las afirmaciones se desactivan y se ignoran en tiempo de ejecución.

Para habilitar las afirmaciones, usamos:

 java -ea:arguments

O

 java -enableassertions:arguments

Cuando las aserciones están habilitadas y la condición es true, el programa se ejecuta normalmente.

Pero si la condición se evalúa falsemientras las aserciones están habilitadas, JVM arroja un AssertionErrory el programa se detiene inmediatamente.

Ejemplo 1: afirmación de Java

 class Main ( public static void main(String args()) ( String() weekends = ("Friday", "Saturday", "Sunday"); assert weekends.length == 2; System.out.println("There are " + weekends.length + " weekends in a week"); ) ) 

Salida

 Hay 3 fines de semana en una semana 

Obtenemos el resultado anterior porque este programa no tiene errores de compilación y, de forma predeterminada, las afirmaciones están deshabilitadas.

Después de habilitar las aserciones, obtenemos el siguiente resultado:

 Excepción en el hilo "principal" java.lang.AssertionError 

Otra forma de afirmación

 assert condition : expression; 

En esta forma de declaración de aserción, se pasa una expresión al constructor del AssertionErrorobjeto. Esta expresión tiene un valor que se muestra como mensaje de detalle del error si la condición es false.

El mensaje detallado se utiliza para capturar y transmitir la información del error de afirmación para ayudar a depurar el problema.

Ejemplo 2: ejemplo de aserción de Java con expresión

 class Main ( public static void main(String args()) ( String() weekends = ("Friday", "Saturday", "Sunday"); assert weekends.length==2 : "There are only 2 weekends in a week"; System.out.println("There are " + weekends.length + " weekends in a week"); ) ) 

Salida

 Excepción en el hilo "main" java.lang.AssertionError: solo hay 2 fines de semana en una semana 

Como vemos en el ejemplo anterior, la expresión se pasa al constructor del AssertionErrorobjeto. Si nuestra suposición es falsey las aserciones están habilitadas, se lanza una excepción con un mensaje apropiado.

Este mensaje ayuda a diagnosticar y corregir el error que provocó el error de la afirmación.

Habilitación de la aserción para clases y paquetes específicos

Si no proporcionamos ningún argumento a los modificadores de la línea de comandos de aserción,

 java -ea 

Esto habilita aserciones en todas las clases excepto las clases del sistema.

También podemos habilitar la aserción para clases y paquetes específicos usando argumentos. Los argumentos que se pueden proporcionar a estos modificadores de línea de comandos son:

Habilitar la aserción en los nombres de las clases

Para habilitar la aserción para todas las clases de nuestro programa Main,

 java -ea Main

Para habilitar solo una clase,

 java -ea:AnimalClass Main

Esto permite la afirmación solo AnimalClassen el Mainprograma.

Habilitar la aserción en los nombres de los paquetes

Para habilitar aserciones solo para el paquete com.animaly sus subpaquetes,

 java -ea:com.animal… Main

Habilitar la aserción en paquetes sin nombre

Para habilitar la aserción en paquetes sin nombre (cuando no usamos una declaración de paquete) en el directorio de trabajo actual.

 java -ea:… Main

Habilitar la aserción en clases de sistema

Para habilitar la aserción en las clases del sistema, usamos un modificador de línea de comandos diferente:

 java -esa:arguments 

O

 java -enablesystemassertions:arguments

Los argumentos que se pueden proporcionar a estos conmutadores son los mismos.

Desactivación de afirmaciones

Para deshabilitar las afirmaciones, usamos:

 java -da arguments 

O

 java -disableassertions arguments 

To disable assertion in system classes, we use:

 java -dsa:arguments

OR

 java -disablesystemassertions:arguments

The arguments that can be passed while disabling assertions are the same as while enabling them.

Advantages of Assertion

  1. Quick and efficient for detecting and correcting bugs.
  2. Assertion checks are done only during development and testing. They are automatically removed in the production code at runtime so that it won’t slow the execution of the program.
  3. It helps remove boilerplate code and make code more readable.
  4. Refactors and optimizes code with increased confidence that it functions correctly.

When to use Assertions

1. Unreachable codes

Unreachable codes are codes that do not execute when we try to run the program. Use assertions to make sure unreachable codes are actually unreachable.

Let’s take an example.

 void unreachableCodeMethod() ( System.out.println("Reachable code"); return; // Unreachable code System.out.println("Unreachable code"); assert false; ) 

Let’s take another example of a switch statement without a default case.

 switch (dayOfWeek) ( case "Sunday": System.out.println("It’s Sunday!"); break; case "Monday": System.out.println("It’s Monday!"); break; case "Tuesday": System.out.println("It’s Tuesday!"); break; case "Wednesday": System.out.println("It’s Wednesday!"); break; case "Thursday": System.out.println("It’s Thursday!"); break; case "Friday": System.out.println("It’s Friday!"); break; case "Saturday": System.out.println("It’s Saturday!"); break; ) 

The above switch statement indicates that the days of the week can be only one of the above 7 values. Having no default case means that the programmer believes that one of these cases will always be executed.

However, there might be some cases that have not yet been considered where the assumption is actually false.

This assumption should be checked using an assertion to make sure that the default switch case is not reached.

 default: assert false: dayofWeek + " is invalid day"; 

If dayOfWeek has a value other than the valid days, an AssertionError is thrown.

2. Documenting assumptions

To document their underlying assumptions, many programmers use comments. Let’s take an example.

 if (i % 2 == 0) (… ) else ( // We know (i % 2 == 1)… ) 

Use assertions instead.

Comments can get out-of-date and out-of-sync as the program grows. However, we will be forced to update the assert statements; otherwise, they might fail for valid conditions too.

 if (i % 2 == 0) (… ) else ( assert i % 2 == 1 : i;… ) 

When not to use Assertions

1. Argument checking in public methods

Arguments in public methods may be provided by the user.

So, if an assertion is used to check these arguments, the conditions may fail and result in AssertionError.

Instead of using assertions, let it result in the appropriate runtime exceptions and handle these exceptions.

2. To evaluate expressions that affect the program operation

Do not call methods or evaluate exceptions that can later affect the program operation in assertion conditions.

Let us take an example of a list weekdays which contains the names of all the days in a week.

  ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); assert weekdays.removeAll(weekends); 

Here, we are trying to remove elements Saturday and Sunday from the ArrayList weekdays.

Si la aserción está habilitada, el programa funciona bien. Sin embargo, si las aserciones están deshabilitadas, los elementos de la lista no se eliminan. Esto puede resultar en una falla del programa.

En su lugar, asigne el resultado a una variable y luego use esa variable para la aserción.

 ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved; 

De esta manera, podemos asegurarnos de que todos los fines de semana se eliminen de los días de la semana independientemente de que la aserción esté habilitada o deshabilitada. Como resultado, no afecta el funcionamiento del programa en el futuro.

Articulos interesantes...