English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderemos el enunciado assert de Java (Java afirmación) mediante ejemplos.
Las afirmaciones en Java ayudan a detectar errores mediante la prueba de código que consideramos correcto.
Realizar afirmaciones utilizando la palabra clave assert.
Su sintaxis es:
assert condition;
Aquí condition es una expresión booleana, suponemos que es verdadera durante la ejecución del programa.
Por defecto, las afirmaciones están desactivadas en tiempo de ejecución y se ignoran.
Para activar las afirmaciones, utilizamos:
java -ea:arguments
o
java -enableassertions:arguments
Si la afirmación se activa y la condición es true, el programa se ejecutará normalmente.
Pero, si la condición se calcula como false al activar la afirmación, el JVM lanzará AssertionError y el programa se detendrá inmediatamente.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("这个星期有 " + weekends.length + " 周末"); } }
Resultado de salida
En esta semana hay 3 周末
Obtenemos el output anterior porque el programa no tiene errores de compilación y las afirmaciones están deshabilitadas por defecto.
Después de habilitar las afirmaciones, obtenemos el siguiente output:
Exception in thread "main" java.lang.AssertionError
assert condition : expression;
En esta forma de declaración de afirmación, se pasa la expresión al constructor del objeto AssertionError. Si la condición es false, el valor de la expresión se muestra como detalles de error.
Un mensaje detallado se utiliza para capturar y transmitir información sobre el fracaso de las afirmaciones, ayudando a depurar problemas.
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"); } }
Resultado de salida
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Como se puede ver en el ejemplo anterior, la expresión se pasa al constructor del objeto AssertionError. Si nuestra hipótesis es incorrecta false y las afirmaciones están habilitadas, se lanzará una excepción y se mostrará un mensaje adecuado.
Este mensaje ayuda a diagnosticar y reparar errores que causan el fracaso de las afirmaciones.
Si no proporcionamos ningún parámetro a los interruptores de línea de comandos de afirmación,
java -ea
Esto habilitará las afirmaciones en todas las clases excepto en las clases del sistema.
También podemos usar parámetros para habilitar afirmaciones para clases y paquetes específicos. Los parámetros que se pueden proporcionar a estos interruptores de línea de comandos son:
habilitar las afirmaciones en el nombre de la clase
Para habilitar las afirmaciones para todas las clases del programa Main,
java -ea Main
solo se habilita una clase,
java -ea:AnimalClass Main
Esto solo permite usar afirmaciones en la clase AnimalClass del programa Main.
Habilitar afirmaciones en nombre de paquete
Habilitar afirmaciones en el paquete com.animal y sus subpaquetes
java -ea:com.animal... Main
Habilitar afirmaciones en paquete sin nombre
Habilitar afirmaciones en el paquete sin nombre en el directorio de trabajo actual (cuando no se usa la declaración package).
java -ea:... Main
Habilitar afirmaciones en clases del sistema
Para habilitar las afirmaciones en las clases del sistema, usamos diferentes switches de línea de comandos:
java -esa:arguments
o
java -enablesystemassertions:arguments
Los parámetros que se pueden proporcionar a estos interruptores son los mismos.
Para deshabilitar las afirmaciones, usamos:
java -da arguments
o
java -disableassertions arguments
Para deshabilitar las afirmaciones en las clases del sistema, usamos:
java -dsa:arguments
o
java -disablesystemassertions:arguments
Los argumentos que se pueden pasar cuando se deshabilitan las afirmaciones son los mismos que cuando se habilitan.
Detectar y corregir errores de manera rápida y eficiente.
La verificación de afirmaciones se realiza solo durante el desarrollo y la prueba. Se eliminan automáticamente del código de producción en tiempo de ejecución, por lo que no ralentiza la ejecución del programa.
Ayuda a eliminar el código样板 y hacer que el código sea más legible.
Reestructurar y optimizar el código para aumentar la confianza en su ejecución correcta.
El código inalcanzable es el código que no se ejecutará cuando intentemos ejecutar el programa. Usamos afirmaciones para asegurarnos de que el código inalcanzable realmente no se puede alcanzar.
Vamos a dar un ejemplo.
void unreachableCodeMethod() { System.out.println("Código alcanzable"); return; // Código inalcanzable System.out.println("Código inalcanzable"); assert false; }
Vamos a ver un ejemplo de una declaración switch sin caso por defecto.
switch (dayOfWeek) { case "domingo": System.out.println("¡Es domingo!"); break; case "lunes": System.out.println("¡Es lunes!"); break; case "martes": System.out.println("¡Es martes!"); break; case "Wednesday": System.out.println("¡Es miércoles!"); break; case "Thursday": System.out.println("¡Es jueves!"); break; case "Friday": System.out.println("¡Es viernes!"); break; case "Saturday": System.out.println("¡Es sábado!"); break; }
La declaración switch superior indica que los días de la semana solo pueden ser los siguientes7uno de los valores. No hay condición predeterminada significa que el programador cree que una de estas situaciones se ejecutará siempre.
Pero, en algunos casos hipotéticos que son erróneos, pueden no haberse considerado ciertas situaciones.
Debería usarse una afirmación para verificar esta hipótesis para asegurarse de que no se alcance la condición de switch predeterminada.
default: assert false: dayofWeek + "es día inválido";
Lance AssertionError si el valor de dayOfWeek no es una fecha válida.
Para registrar sus hipótesis básicas, muchos programadores utilizan comentarios. Vamos a dar un ejemplo.
if (i % 2 == 0) { ... } else { // Sabemos que (i % 2 == 1) ... }
Por favor, utilice afirmaciones.
Con el crecimiento del programa, los comentarios pueden volverse obsoletos y no estar alineados. Sin embargo, tendremos que actualizar las afirmaciones; de lo contrario, también pueden fallar debido a condiciones válidas.
if (i % 2 == 0) { ... } else { assert i % 2 == 1 : i; ... }
Los usuarios pueden proporcionar parámetros en métodos públicos.
Por lo tanto, si se utilizan afirmaciones para verificar estos parámetros, las condiciones podrían fallar y causar AssertionError.
En lugar de usar afirmaciones, es mejor que generen excepciones de tiempo de ejecución apropiadas y manejen estas excepciones.
No llame a métodos o evalúe excepciones que podrían afectar la operación del programa en condiciones de afirmación.
Vamos a tomar un ejemplo de lista, weekdays que contiene los nombres de todos los días de la semana.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Domingo", "Sábado")); assert weekdays.removeAll(weekends);
Aquí, intentamos eliminar los elementos Saturday y Sunday de la ArrayList weekdays.
Si se activa la afirmación, el programa puede funcionar correctamente. Sin embargo, si se desactiva la afirmación, no se eliminarán los elementos de la lista. Esto podría llevar al fracaso del programa.
En lugar de asignar el resultado a una variable y luego usar esa variable para la afirmación.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Domingo", "Sábado")); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved;
De esta manera, podemos asegurarnos de que se eliminen todos los fines de semana de weekdays, sin considerar si las afirmaciones están activadas o desactivadas. Como resultado, no afectará las operaciones del programa futuras.