¿Qué hace la palabra clave “assert”?

¿Qué assert hacer? Por ejemplo en la función:

 private static int charAt(String s, int d) { assert d >= 0 && d <= s.length(); if (d == s.length()) return -1; return s.charAt(d); } 

Si -enableassertions su progtwig con -enableassertions (o -ea para abreviar), entonces esta statement

 assert cond; 

es equivalente a

 if (!cond) throw new AssertionError(); 

Si inicia su progtwig sin esta opción, la statement de afirmación no tendrá ningún efecto.

Por ejemplo, assert d >= 0 && d < = s.length(); , como se publicó en su pregunta, es equivalente a

 if (!(d >= 0 && d < = s.length())) throw new AssertionError(); 

(Si -enableassertions con -enableassertions eso es).


Formalmente, la especificación del lenguaje Java: 14.10. La statement de assert dice lo siguiente:

14.10. La statement de assert
Una aserción es una statement de afirmación que contiene una expresión booleana. Una afirmación está habilitada o deshabilitada . Si la aserción está habilitada, la ejecución de la aserción causa la evaluación de la expresión booleana y se informa un error si la expresión se evalúa como false . Si la afirmación está deshabilitada, la ejecución de la afirmación no tiene ningún efecto en absoluto.

Donde "habilitado o deshabilitado" se controla con el interruptor -ea y "Se informa un error" significa que se lanza un AssertionError .


Y finalmente, una característica menos conocida de assert :

Puede agregar : "Error message" como este:

 assert d != null : "d is null"; 

para especificar cuál debería ser el mensaje de error del AssertionError arrojado.


Esta publicación ha sido reescrita como un artículo aquí .

Si la condición no se cumple, se lanzará un AssertionError .

Las aserciones deben estar habilitadas, sin embargo; de lo contrario, la expresión de afirmación no hace nada. Ver:

http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

assert es una herramienta de depuración que provocará que el progtwig arroje una excepción AssertionFailed si la condición no es verdadera. En este caso, el progtwig arrojará una excepción si cualquiera de las dos condiciones posteriores a ella se evalúa como falsa. En términos generales, assert no debe usarse en el código de producción

Aunque he leído mucha documentación sobre esto, todavía estoy confundido sobre cómo, cuándo y dónde usarlo.

Haz que sea muy simple de entender:

Cuando tienes una situación similar a esta:

  String strA = null; String strB = null; if (2 > 1){ strA = "Hello World"; } strB = strA.toLowerCase(); 

Puede recibir una advertencia (mostrando una línea amarilla en strB = strA.toLowerCase ();) que strA podría producir un valor NULL para strB. Aunque sabes que strB es absolutamente no será nulo al final, por si acaso, usas assert para

1. Desactiva la advertencia.

2. Lanzar un error de excepción. Ocurre lo peor (cuando ejecuta su aplicación).

En algún momento, cuando comstack su código, no obtiene su resultado y es un error. Pero la aplicación no se bloqueará y pasará un momento muy difícil para encontrar dónde está causando este error.

Entonces, si pones afirma, así:

  assert strA != null; //Adding here strB = strA .toLowerCase(); 

usted le dice al comstackdor que strA no es absolutamente un valor nulo, puede apagar la advertencia ‘pacíficamente’. SI es NULO (sucede el peor de los casos), detendrá la aplicación y le lanzará un error para localizarla.

Utilice esta versión de la statement assert para proporcionar un mensaje de detalle para el AssertionError. El sistema pasa el valor de Expression2 al constructor AssertionError apropiado, que utiliza la representación de cadena del valor como el mensaje de detalle del error.

El propósito del mensaje de detalle es capturar y comunicar los detalles de la falla de aserción. El mensaje debería permitirle diagnosticar y, en última instancia, corregir el error que provocó la falla de la aserción. Tenga en cuenta que el mensaje de detalle no es un mensaje de error de nivel de usuario, por lo que generalmente no es necesario hacer que estos mensajes sean comprensibles de manera aislada o internacionalizarlos. El mensaje de detalle debe interpretarse en el contexto de una traza de stack completa, junto con el código fuente que contiene la aserción fallida.

JavaDoc

Las afirmaciones generalmente se usan principalmente como un medio para verificar el comportamiento esperado del progtwig. Debería provocar un locking en la mayoría de los casos, ya que las suposiciones del progtwigdor sobre el estado del progtwig son falsas. Aquí es donde entra el aspecto de depuración de las aserciones. Crean un punto de control que simplemente no podemos ignorar si queremos tener un comportamiento correcto.

En su caso, hace la validación de datos en los parámetros entrantes, aunque no evita que los clientes hagan un mal uso de la función en el futuro. Especialmente si no se incluyen (y no deberían) en las comstackciones de lanzamiento.

Asegura que la expresión sea verdadera. De lo contrario, arroja un java.lang.AssertionError .

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

Assert lanza un AssertionError si ejecuta su aplicación con las aserciones activadas.

 int a = 42; assert a >= 0 && d < = 10; 

Si ejecuta esto con, digamos: java -ea -jar peiska.jar

Lanzará un java.lang.AssertionError