Vamos verificar alguns pontos do tratamento de exceções no Java. O primeiro tópico que vou tratar neste post é a diretiva
assert
. Ela é utilizada para nos permitir gerar paradas na execução do programa baseado em uma condição booleana. Esta diretiva existe desde a versão 1.4 do Java. Este recurso permite que testemos alguma pré suposição durante o desenvolvimento ter que escrever manipuladores para exceções que provavelmente não ocorrerão quando o programa tiver saído da fase de desenvolvimento.
As assertivas permitem que você teste suas suposições durante a fase de desenvolvimento.
A estrutura do comando é
assert Expressao_booleana : método_não_void;
Como por exemplo:
assert (boolean) : string;
O comando funciona da seguinte maneira: o valor
(boolean)
deve ser sempre verdadeiro. Quando este valor for avaliado como falso, é gerado uma exceção tipo AssertionError.
Por padrão,
assert
vem desabilitado. Para desfrutar do recurso é necessário ativá-lo. Os passos são:
1.Colocar as clausulas
assert nos locais desejados no nosso programa
2.Compilar as classes (devemos solicitar que a compilação seja feita para uma versão superior a 1.4)
javac -source 1.5 classe.java
3.Habilitar o uso de assert durante a execução utilizando um dois dois parâmetros do java
java –ea classe
java –enableassertions classe
Para desabilitar as assertivas usamos os parâmetros
java –da classe
java –disableassertions classe
Regras de uso
assert:
- Assert não pode ser usado no lugar do IF
- Assert não pode testar métodos públicos ou argumento digitado pelo usuário
- Não pode apresentar efeitos colaterais no programa, ou seja, o seu programa deve rodar tanto com ele habilitado ou não.
Como recomendação nós devemos utilizar
assert quando escreveríamos um comentários por exemplo em uma cláusula if-then-else. Vamos ver um exemplo abaixo:
if (i % 3 == 0) {
...
} else if (i % 3 == 1) {
...
} else {
assert i % 3 == 2 : i;
...
}
Note que esperamos que (i % 3) na última cláusula
else sempre dê 2. Porém como o operador % não opera módulo, podemos eventualmente um valor negativo, que não estamos esperando neste local. Com isto uma exceção AssertionError pode ser utilizada.
Outro local onde poderíamos utilizar assert é em declarações
switch...
case sem cláusula
default. A inexistência de uma cláusula default não é recomendada, mas vamos dizer que acreditamos que testamos os pontos cardeiais como no switch abaixo:
switch (direcao) {
case PontoCardeal.NORTE:
....
break;
case PontoCardeal.SUL:
....
break;
case PontoCardeal.LESTE:
....
break;
case PontoCardeal.OESTE:
....
break;
}
se a variável direcao for do tipo Enum PontoCardeal nunca teremos necessidade de uma cláusula default. Uma alteração possível é a colocação da seguinte cláusula default.
default:
throw new AssertionError(suit);
Se a variável aceitar um quinto valor, será gerada uma exceção AssertionError.