quinta-feira, 8 de março de 2007

Asserts

Assertions são declarações inseridas no código com a finalidade de verificar uma certa condição de prosseguir na execução do programa. O uso dos asserts deve ser limitado a verificações e debug em processos de desenvolvimento e teste, não devendo ser usado em verificações de rotina em sistemas em produção.
Para verificações em produção, o correto é utilizar-se Exceptions.

Formato:

Existem dois formatos possíveis de assert:

assert (expressão boolena);

ou

assert (expressão booleana) : (mensagem);

onde:

expressão booleana: Qualquer expressão que produza um resultado true ou false, sendo que, caso o resultado seja true, a execução do programa continua normalmente e, caso seja false, é lançado um AssertionError e a execução é interrompida.

Exemplos:


true // nunca vai interromper a execução;
false // sempre vai interromper;
x == 0 // só permeite a continuação caso a variável x tenha valor 0;
x.equals(y) // só permite a continuação caso o objeto x seja igual a y;

mensagem : Uma mensagem que será mostrada juntamente com a mensagem de erro.

Exemplos:

"Erro!"


x // caso x seja um int por exemplo, será impresso o seu valor
// caso x seja um objeto será impresso o que estiver definido no método toString()
    // da respectiva classe (ou superclasse conforme o caso).

Um uso de assert:

public double calculaLog (double x) {
// diversas operações feitas aqui com x e que,
//na visão do desenvolvedor, sempre levarão x a um valor positivo
assert x > 0 : "x não pode ser negativo";
return Math.log (x);
}

No exemplo acima, o uso do método log() da classe Math não permite que o valor de x seja negativo (já que não são definidos logarítmos de números negativos). Nas operações feitas no início do método, o programador acredita ter garantido que o valor de x chegará ao método log() com valor positivo. O assert inserido ali tem a finalidade de verificar essa "certeza" durante a fase de testes do programa. Caso, durante a execução, o valor de x seja negativo, a seguinte mensagem será impressa:

Exception in thread "main" java.lang.AssertionError: x não pode ser negativo
at testeenum.Lanchonete.main(Lanchonete.java:19)
Java Result: 1

No entanto, se o valor de x realmente for positivo, o assert será ignorado e a execução do programa continuará normalmente.

Habilitando o processamento de asserts:

Para que o asserts inseridos no código seja processados pela JVM, é necessário incluir a opção durante a execução do programa. Na execução pela linha de comando, deve-se inserir a opção -ea ou -enableasserts na chamada da JVM:

java -ea Calcula ou java -enableasserts Calcula

Por definição essa opção fica em "off" a menos que seja ligada. Apesar de não fazer muito sentido, pode-se optar por desligar-se manualmente o processamento de asserts com a opção -da ou -disableassertions.

Uma combinação interessante pode ser feita quando deseja-se habilitar o processamento no programa mas desabilitá-lo em uma classe específica:

java -ea -da:Calcula

Como esse blog é para aviões e Java, o próximo post deverá ser sobre aviões :)

Até lá...


Nenhum comentário: