java osx swing osx-snow-leopard

java - Afirmación no funciona



osx swing (3)

Intento escribir una Afirmación para verificar si el tamaño que da el usuario es un valor positivo, si no, hazlo positivo, esta afirmación está dentro del constructor de la clase que toma el valor de tamaño y luego crea una matriz [tamaño]. He escrito el código a continuación, que creo que es correcto.

public Grid(int size) { try{ assert size > 0 ; } catch(AssertionError e){ size = Math.abs(size); } setLayout(new GridLayout(size, size)); grid = new JButton[size][size]; }

Aunque parece que nunca evalúo mi afirmación y continúo el programa, provoca el error NegativeArraySize (que estoy tratando de evitar)

También intenté solo

assert size>0;

Y el programa no puede detenerse por valores negativos ...

He tenido algunos problemas con la ejecución de java en mac recientemente, así que no sé si mi código es correcto o si es solo uno de esos extraños rarezas de mac. y debería simplemente usar

size=Math.abs(size);

Gracias Sam,


Como assert es una nueva palabra clave Java introducida en JDK 1.4, debe compilar el programa utilizando un compilador JDK 1.4. Además, debe incluir el switch -ource 1.4 en el comando del compilador de la siguiente manera:

javac –source 1.4 AssertionDemo.java

NOTA: Si usa JDK 1.5 o posterior, no es necesario utilizar la opción -source 1.4 en el comando.

Por defecto, las aserciones están deshabilitadas en tiempo de ejecución. Para habilitarlo, use el interruptor -enablesertions , o -ea para abreviar, de la siguiente manera:

java –ea AssertionDemo

Las afirmaciones se pueden habilitar o deshabilitar selectivamente a nivel de clase o paquete. El interruptor de desactivación es -disableassertions o -da para abreviar.

Por ejemplo, el siguiente comando habilita las aserciones en el paquete paquete1 y deshabilita las aserciones en la clase Class1.

java –ea:package1 –da:Class1 AssertionDemo

La aserción no debe usarse para reemplazar el manejo de excepciones. El manejo de excepciones se ocupa de circunstancias inusuales durante la ejecución del programa. Las afirmaciones son para asegurar la corrección del programa. El manejo de excepciones aborda la solidez y la afirmación aborda la corrección. Al igual que el manejo de excepciones, las aserciones no se usan para las pruebas normales, sino para la consistencia interna y las verificaciones de validez.

Entonces, en este caso, la mejor respuesta es el manejo de excepciones.

No use aserciones para verificar argumentos en métodos públicos. Los argumentos válidos que pueden pasarse a un método público se consideran parte del contrato del método. El contrato siempre debe obedecerse si las afirmaciones están habilitadas o deshabilitadas. Por ejemplo, el código anterior debe reescribirse utilizando el manejo de excepciones


Las afirmaciones se pueden habilitar o deshabilitar cuando se inicia el programa y están desactivadas de manera predeterminada.

Ver Habilitar y deshabilitar las afirmaciones

En resumen, para habilitar las aserciones en todas las clases, excepto en las clases del sistema, use el -enableassertions , o -ea , cuando ejecute su clase.


Necesita ejecutar su programa con el -ea (habilitar aserciones), de lo contrario, la JVM no ejecutará ninguna instrucción afirmativa. Dependiendo de aseveraciones es un poco peligroso. Te sugiero que hagas algo como esto:

public Grid(int size) { size = Math.max(0, size) setLayout(new GridLayout(size, size)); grid = new JButton[size][size]; }

O incluso así:

public Grid(int size) { if(size < 0) { throw new IllegalArgumentException("cannot create a grid with a negative size"); } setLayout(new GridLayout(size, size)); grid = new JButton[size][size]; }

La segunda sugerencia tiene la ventaja de mostrarle posibles errores de programación en otras partes de su código, mientras que la primera lo ignora en silencio. Esto depende de tu caso de uso.