HOWTO · Java
La palabra clave assert en Java
Este artículo describe cuándo y cómo utilizar la palabra clave de aserción de Java.
En esta página
La palabra clave assert de Java comprueba una suposición del programador, y la JVM desactiva las aserciones de forma predeterminada. Inicia el programa con -ea para activarlas. Si la condición de una aserción activada se evalúa como falsa, Java lanza un AssertionError; de lo contrario, la ejecución continúa. Usa aserciones para comprobar suposiciones internas que deberían cumplirse durante el desarrollo, no para realizar acciones que la aplicación deba ejecutar en cada ejecución.
Usar assert como condición booleana en Java
La forma básica es assert condition;, donde condition debe ser una expresión booleana. Si las aserciones están activadas y la expresión es falsa, Java lanza un AssertionError en la instrucción de aserción. Si están desactivadas, la JVM omite la aserción, incluida la evaluación de su condición. Por eso, la condición no debe realizar tareas de las que dependa el programa.
Esta clase completa comprueba un recuento e imprime un resultado breve.
public class JavaAssertCheck {
public static void main(String[] args) {
String[] names = {"John", "Mary", "David"};
assert names.length == 3;
System.out.println("Name count: " + names.length);
}
}
Compila la clase y luego ejecútala con java -ea JavaAssertCheck para activar la comprobación. Si la ejecutas sin -ea, se omitirá. Si cambias el recuento esperado por un valor que no coincida con el tamaño del arreglo y activas las aserciones, el programa se detendrá en la aserción y lanzará un AssertionError.
Añadir un mensaje de diagnóstico con assert condition : expression
Usa assert condition : expression si quieres que el fallo incluya contexto. La expresión solo se evalúa cuando las aserciones están activadas y la condición es falsa; su valor se convierte en el mensaje detallado del AssertionError resultante. Por ejemplo, assert names.length == expected : "Expected " + expected + " names, got " + names.length; identifica ambos recuentos. Evita los efectos secundarios en la expresión, ya que no se evalúa si la condición se cumple o si las aserciones están desactivadas.
Usar assert para señalar una rama inesperada
Una aserción puede marcar una rama de ejecución que, según la lógica del programa, nunca debería alcanzarse. Java rechaza una instrucción colocada después de un return incondicional, así que coloca la aserción dentro de una rama cuya imposibilidad el compilador no pueda demostrar:
public class StatusLabel {
static String label(int status) {
if (status == 0) {
return "ready";
} else if (status == 1) {
return "busy";
} else {
assert false : "Unexpected status: " + status;
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(label(0));
}
}
Si las aserciones están activadas, llegar a la rama final lanza un AssertionError con el estado como contexto. Si están desactivadas, la ejecución llega al return alternativo; por tanto, esta aserción sirve como ayuda de diagnóstico y no como parte necesaria del flujo de control.
Usar aserciones de forma segura para invariantes internas
Las aserciones sirven para documentar invariantes que establece el propio programa; por ejemplo, que un valor se mantiene dentro de un intervalo después de un cálculo interno. Pueden facilitar la localización de una suposición incumplida durante el desarrollo.
No uses una aserción para validar los argumentos que recibe un método público: quienes lo llaman necesitan una respuesta de validación definida, independientemente de las opciones de la JVM. Del mismo modo, no pongas dentro de una aserción tareas que la aplicación deba realizar, porque las aserciones desactivadas omiten su condición. Evita también los efectos secundarios en las expresiones de aserción por la misma razón. Usa validación y flujo de control ordinarios siempre que el programa deba responder de forma consistente en producción.