Assert em Java
O mecanismo assert (asserção) é um padrão comum de verificação de condições internas de um programa, conhecido como guard pattern. Ele permite testar, durante a execução, se determinadas condições lógicas estão sendo respeitadas. Para isso, o Java oferece a palavra-chave assert.
O operador assert é usado para detectar erros em situações em que não faz sentido continuar a execução do programa. Normalmente, é empregado durante o desenvolvimento e a fase de testes, para identificar inconsistências ou falhas internas.
Formas do operador assert
O operador assert pode ser escrito de duas formas:
assert condição;
assert condição : expressão;Em ambas, o Java verifica se a condição é verdadeira.
Se for falsa, a JVM lança uma exceção do tipo AssertionError.
Na segunda forma, após o símbolo de dois pontos, é possível indicar uma expressão que será passada ao construtor de AssertionError. Esse valor é incluído na mensagem de erro exibida.
Por exemplo, a primeira forma:
assert n > 0;Aqui o operador assert verifica se a variável n é maior que 0.
Se n for 0 ou menor, o sistema lançará um erro AssertionError.
A segunda forma:
assert n > 0 : n;Neste caso, o valor de n é incluído na mensagem do erro, facilitando a depuração.
Ativando o suporte a assert
Por padrão, o operador assert não afeta a execução do programa.
O erro AssertionError só é gerado se o suporte a asserções for explicitamente ativado no momento da execução.
Para habilitar as asserções, é necessário usar a opção -enableassertions ou sua forma abreviada -ea ao executar o programa:
java -enableassertions Program
Também é possível habilitar asserções apenas para classes ou pacotes específicos:
java -ea:SomeClass -ea:com.mycompany.somelib... Program
-ea:SomeClassativa asserções apenas na classeSomeClass.-ea:com.mycompany.somelib...ativa para todo o pacotecom.mycompany.somelib.
Se o programa estiver no pacote padrão (sem nome), o comando é:
java -ea:... Program
É possível também desativar asserções em classes ou pacotes específicos, mesmo que estejam ativas globalmente, com as opções -disableassertions ou -da:
java -ea:... -da:SomeClass Program
Exemplo de uso de assert
O exemplo a seguir mostra o uso do operador assert dentro de um método que calcula o fatorial de um número:
class Program {
public static void main(String[] args) {
int f1 = factorial(4);
System.out.println("f1: " + f1);
int f2 = factorial(-4);
System.out.println("f2: " + f2);
}
static int factorial(int n) {
assert n > 0;
int result = 1;
while (n > 1) result *= n--;
return result;
}
}O método factorial() calcula o fatorial do número recebido como parâmetro.
Entretanto, o fatorial só é definido para números positivos, portanto o código inclui uma asserção assert n > 0 para verificar essa condição.
No método main(), a função é chamada duas vezes: uma com um valor válido e outra com um valor inválido.
Compilando e executando com as asserções habilitadas:
javac Program.java && java -enableassertions Program
Saída esperada:
f1: 24 Exception in thread "main" java.lang.AssertionError at Program.factorial(Program.java:14) at Program.main(Program.java:8)
O primeiro cálculo (factorial(4)) ocorre normalmente.
No segundo (factorial(-4)), a asserção falha e o programa gera um AssertionError na linha correspondente.
Durante o teste ou desenvolvimento, isso permite identificar rapidamente condições incorretas ou casos não tratados, que podem ser ajustados posteriormente com verificações explícitas.
Forma alternativa do assert
Se o método factorial() for alterado para incluir uma mensagem personalizada:
static int factorial(int n) {
assert n > 0 : n;
int result = 1;
while (n > 1) result *= n--;
return result;
}Nesse caso, o valor de n é passado ao AssertionError e exibido na mensagem de erro:
f1: 24 Exception in thread "main" java.lang.AssertionError: -4 at Program.factorial(Program.java:14) at Program.main(Program.java:8)
Isso facilita a identificação da causa do problema. Também é possível especificar uma mensagem mais descritiva:
assert n > 0 : "O parâmetro é menor que 1";Resumo
- O operador
assertverifica condições durante a execução e lançaAssertionErrorquando uma condição é falsa. - Pode ser usado nas formas
assert condição;eassert condição : expressão;. - Por padrão, as asserções estão desativadas e precisam ser habilitadas com
-enableassertionsou-ea. - É possível ativar ou desativar asserções seletivamente por classe ou pacote.
- O uso de
assertajuda a detectar erros lógicos durante o desenvolvimento e os testes.