java - how - ¿Qué hace la palabra clave "assert"?
how to use assert java (8)
Utilice esta versión de la declaración 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 pila completa, junto con el código fuente que contiene la aserción fallida.
Esta pregunta ya tiene una respuesta aquí:
¿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);
}
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
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 compila 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 compilador 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.
Las afirmaciones generalmente se usan principalmente como un medio para verificar el comportamiento esperado del programa. Debería provocar un bloqueo en la mayoría de los casos, ya que las suposiciones del programador sobre el estado del programa 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 compilaciones de lanzamiento.
Si -enableassertions
su programa con -enableassertions
(o -ea
para abreviar), entonces esta declaración
assert cond;
es equivalente a
if (!cond)
throw new AssertionError();
Si inicia su programa sin esta opción, la declaración 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 declaración de assert
dice lo siguiente:
14.10. La declaración de
assert
Una aserción es una declaración 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 comofalse
. 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 here .
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 programa arroje una excepción AssertionFailed
si la condición no es verdadera. En este caso, el programa 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