Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

¿Qué hace assert? 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);
}
¿Fue útil?

Solución

Si inicia 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 sentencia assert no tendrá ningún efecto.

Por ejemplo, assert d >= 0 && d <= s.length();, tal como fue anunciado en su pregunta, es equivalente a

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

(Si se puso en marcha con -enableassertions que es.)


Formalmente, el Java Language Specification : 14.10. La Declaración assert dice lo siguiente:

  

14.10. La Declaración assert
   Una afirmación es una declaración assert que contiene una expresión booleana. Una afirmación es ya sea activado o desactivado . Si se habilita la afirmación, la ejecución de la afirmación provoca la evaluación de la expresión lógica y se notifica un error si la expresión se evalúa false. Si la afirmación es desactivada, la ejecución de la afirmación no tiene efecto alguno.

Donde "activado o desactivado" se controla con el interruptor -ea y "se informa de un error" significa que un AssertionError se lanza.


Y, por último, una característica menos conocida de assert:

Se puede añadir : "Error message" como esto:

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

para especificar cuál debe ser el mensaje de error de la AssertionError tirado.


Esta respuesta ha sido reescrito como un artículo aquí .

Otros consejos

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

Las afirmaciones deben estar habilitados, sin embargo; de lo contrario la expresión assert 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 hará que el programa para lanzar una excepción AssertionFailed si la condición no es cierto. En este caso, el programa va a lanzar una excepción si alguna de las dos condiciones siguientes se evalúa como falsa. En términos generales, assert no se debe utilizar en el código de producción

Aunque he leído un montón de documentación acerca de esto, todavía estoy confuso sobre cómo, cuándo y dónde usarlo.

hacen que sea muy fácil de entender:

Cuando se tiene una situación similar como esto:

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

    strB = strA.toLowerCase(); 

Es posible que reciba aviso (mostrando línea amarilla en strB = strA.toLowerCase ();) que strA podría producir un valor NULL para strB. Aunque se sabe que es absolutamente strB no será nulo al final, por si acaso, se utiliza para afirmar

1. Desactivar la advertencia.

2. El tiro de error de excepción si ocurre lo peor (cuando se ejecuta la aplicación).

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

Por lo tanto, si se pone afirman, como esto:

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

le dice al compilador que strA no es en absoluto un valor nulo, se puede 'pacíficamente' desactivar la advertencia. Si es nulo (peor de los casos sucede), se detendrá la aplicación y lanzar un error de usted para localizarlo.

  

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

     

El propósito del mensaje de detalle es capturar y comunicar los detalles del error de aserción. El mensaje debe permitir a diagnosticar y, finalmente, corregir el error que llevó a la afirmación de fallar. Tenga en cuenta que el mensaje de detalle no es un mensaje de error a nivel de usuario, por lo que generalmente no es necesario para hacer que estos mensajes comprensibles de manera aislada, o la internacionalización de ellos. El mensaje de detalle está destinado a ser interpretado en el contexto de un seguimiento de la pila completa, en conjunción con el código fuente que contiene la afirmación fallado.

JavaDoc

Las afirmaciones son generalmente utilizados principalmente como un medio de control de comportamiento esperado del programa. Se debe conducir a un accidente en la mayoría de los casos, ya que los supuestos del programador sobre el estado del programa son falsas. Aquí es donde el aspecto de depuración de las afirmaciones entrar. Crean un puesto de control que simplemente no podemos pasar por alto si nos gustaría tener un comportamiento correcto.

En su caso lo hace la validación de datos de los parámetros de entrada, aunque no impide que los clientes hagan mal uso de la función en el futuro. Sobre todo si no es así, (y no debe) ser incluido en las versiones de lanzamiento.

Se asegura de que la expresión devuelve cierto. De lo contrario, se lanza una java.lang.AssertionError.

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

Assert hace lanzar una AssertionError si ejecuta su aplicación con las afirmaciones activado.

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

Si se ejecuta este con, por ejemplo: java-jar -ea peiska.jar

Será lanzar una java.lang.AssertionError

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top