English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo Java

Java array

Java orientación a objetos (I)

Java orientación a objetos (II)

Java orientación a objetos (III)

Manejo de excepciones en Java

Java Lista (List)

Java Queue (cola)

Conjuntos Java Map

Conjuntos Java Set

Entrada y salida Java (I/O)

Lector Java/Writer

Otras temáticas de Java

Afirmaciones (Assert) de Java

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.

Activar afirmaciones

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.

Ejemplo1:Afirmaciones Java

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

Otra forma de declarar afirmaciones

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.

Ejemplo2:Conjunto de ejemplo de afirmaciones Java con expresiones

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.

habilitar afirmaciones para clases y paquetes específicos

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.

Deshabilitar afirmaciones

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.

Ventajas de las afirmaciones

  1. Detectar y corregir errores de manera rápida y eficiente.

  2. 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.

  3. Ayuda a eliminar el código样板 y hacer que el código sea más legible.

  4. Reestructurar y optimizar el código para aumentar la confianza en su ejecución correcta.

Cuándo usar afirmaciones

1.Código inalcanzable

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.

2.registro de hipótesis

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;
    ...
}

Cuándo no usar afirmaciones

1.comprobación de parámetros en métodos públicos

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.

2.evaluar expresiones que afectan la operación del programa

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.