Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

Aserciones de Java

Afirmaciones Java

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

Las aserciones en Java ayudan a detectar errores al probar el código que asumimos que es verdadero.

Una aserción se hace usando el assert palabra clave.

Su sintaxis es:

assert condition;

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


Habilitación de aserciones

De forma predeterminada, las aserciones están deshabilitadas e ignoradas en tiempo de ejecución.

Para habilitar aserciones, 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 como false mientras las aserciones están habilitadas, JVM lanza un AssertionError y el programa se detiene inmediatamente.


Ejemplo 1:aserció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

There are 3 weekends in a week

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

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

Exception in thread "main" java.lang.AssertionError

Otra forma de declaración de afirmación

assert condition : expression;

En esta forma de declaración de afirmació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:aserción de Java con ejemplo de 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

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

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 fallo de la afirmación.


Habilitación de 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 en 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 aserción en nombres de 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 habilita la aserción solo en el AnimalClass en el Main programa.

Habilitar aserción en nombres de paquetes

Para habilitar aserciones para el paquete com.animal y sus subpaquetes solamente,

java -ea:com.animal... Main

Habilitar 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 aserción en clases del sistema

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

java -esa:arguments 

O

java -enablesystemassertions:arguments

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


Deshabilitar aserciones

Para deshabilitar aserciones, usamos:

java -da arguments 

O

java -disableassertions arguments

Para deshabilitar la aserción en las clases del sistema, usamos:

java -dsa:arguments

O

java -disablesystemassertions:arguments

Los argumentos que se pueden pasar al deshabilitar aserciones son los mismos que al habilitarlas.


Ventajas de la afirmación

  1. Rápido y eficiente para detectar y corregir errores.
  2. Las comprobaciones de afirmación se realizan solo durante el desarrollo y las pruebas. Se eliminan automáticamente en el código de producción en tiempo de ejecución para que no ralentice la ejecución del programa.
  3. Ayuda a eliminar el código repetitivo y hace que el código sea más legible.
  4. Refactoriza y optimiza el código con mayor confianza de que funciona correctamente.

Cuándo usar aserciones

1. Códigos inalcanzables

Los códigos inalcanzables son códigos que no se ejecutan cuando intentamos ejecutar el programa. Utilice aserciones para asegurarse de que los códigos inalcanzables sean realmente inalcanzables.

Tomemos un ejemplo.

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

Tomemos otro ejemplo de una declaración de cambio sin un caso predeterminado.

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

La declaración de cambio anterior indica que los días de la semana pueden ser solo uno de los 7 valores anteriores. No tener un caso predeterminado significa que el programador cree que uno de estos casos siempre se ejecutará.

Sin embargo, puede haber algunos casos que aún no se hayan considerado en los que la suposición sea realmente falsa.

Esta suposición debe verificarse mediante una aserción para asegurarse de que no se alcance el caso de cambio predeterminado.

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

Si día de la semana tiene un valor diferente a los días válidos, un AssertionError es arrojado.


2. Documentación de supuestos

Para documentar sus suposiciones subyacentes, muchos programadores usan comentarios. Tomemos un ejemplo.

if (i % 2 == 0) {
    ...
} else { // We know (i % 2 == 1)
    ...
}

Utilice aserciones en su lugar.

Los comentarios pueden quedar desactualizados y desincronizados a medida que crece el programa. Sin embargo, nos veremos obligados a actualizar el assert declaraciones; de lo contrario, también podrían fallar para condiciones válidas.

if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}

Cuándo no usar aserciones

1. Comprobación de argumentos en métodos públicos

El usuario puede proporcionar argumentos en métodos públicos.

Entonces, si se usa una aserción para verificar estos argumentos, las condiciones pueden fallar y dar como resultado AssertionError .

En lugar de usar aserciones, deje que resulte en las excepciones de tiempo de ejecución apropiadas y maneje estas excepciones.


2. Para evaluar expresiones que afectan el funcionamiento del programa

No llame a métodos ni evalúe excepciones que luego puedan afectar la operación del programa en condiciones de aserción.

Tomemos un ejemplo de una lista días de la semana que contiene los nombres de todos los días de una semana.


ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

assert weekdays.removeAll(weekends);

Aquí, estamos tratando de eliminar elementos Saturday y Sunday de ArrayList días de la semana .

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 afirmación.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;

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


Java

  1. Operadores Java
  2. Comentarios Java
  3. Declaración if...else de Java
  4. Java para cada bucle
  5. Declaración de interrupción de Java
  6. Cadenas Java
  7. Interfaz Java
  8. Clase anónima de Java
  9. Prueba de Java con recursos
  10. Anotaciones Java
  11. Java Vector