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 assert
palabra clave.
Su sintaxis es:
assert condition;
Aquí, condition
hay 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 false
mientras las aserciones están habilitadas, JVM arroja un AssertionError
y 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 AssertionError
objeto. 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 AssertionError
objeto. Si nuestra suposición es false
y 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 AnimalClass
en el Main
programa.
Habilitar la aserción en los nombres de los paquetes
Para habilitar aserciones solo para el paquete com.animal
y 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
- Quick and efficient for detecting and correcting bugs.
- 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.
- It helps remove boilerplate code and make code more readable.
- 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.