O que a palavra -chave "afirma"? [duplicado
Pergunta
Esta pergunta já tem uma resposta aqui:
O que assert
Faz? Por exemplo, na função:
private static int charAt(String s, int d) {
assert d >= 0 && d <= s.length();
if (d == s.length()) return -1;
return s.charAt(d);
}
Solução
Se você iniciar seu programa com -enableassertions
(ou -ea
para abreviar) então esta afirmação
assert cond;
é equivalente a
if (!cond)
throw new AssertionError();
Se você iniciar seu programa sem esta opção, a instrução Assert não terá efeito.
Por exemplo, assert d >= 0 && d <= s.length();
, conforme postado em sua pergunta, é equivalente a
if (!(d >= 0 && d <= s.length()))
throw new AssertionError();
(Se você lançou com -enableassertions
isso é.)
Formalmente, o Especificação do idioma Java: 14.10. o assert
Declaração diz o seguinte:
14.10. o
assert
Declaração
Uma afirmação é umassert
declaração contendo uma expressão booleana. Uma afirmação é ativado ou desativado. Se a afirmação for ativada, a execução da afirmação causa a avaliação da expressão booleana e Um erro é relatado Se a expressão avaliar parafalse
. Se a afirmação estiver desativada, a execução da afirmação não terá nenhum efeito.
Onde "Ativado ou desativado" é controlado com o -ea
interruptor e "Um erro é relatado" significa que um AssertionError
é jogado.
E finalmente, uma característica menos conhecida de assert
:
Você pode anexar : "Error message"
assim:
assert d != null : "d is null";
Para especificar qual deve ser a mensagem de erro do ASSERTIONError jogado.
Este post foi reescrito como um artigo aqui.
Outras dicas
Se a condição não estiver satisfeita, um AssertionError
será jogado.
As afirmações devem ser ativadas; caso contrário, o assert
expressão não faz nada. Ver:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
é uma ferramenta de depuração que fará com que o programa jogue um AssertionFailed
exceção se a condição não for verdadeira. Nesse caso, o programa lançará uma exceção se uma das duas condições após ele se avaliar como falsa. De um modo geral, assert
não deve ser usado no código de produção
Embora eu tenha lido muita documentação sobre isso, ainda estou confuso sobre como, quando e onde usá -lo.
Tornar muito simples entender:
Quando você tem uma situação semelhante como esta:
String strA = null;
String strB = null;
if (2 > 1){
strA = "Hello World";
}
strB = strA.toLowerCase();
Você pode receber aviso (exibindo linha amarela no strb = stra.TolowerCase ();) que a stra pode produzir um valor nulo para strb. Embora você saiba que o STRB não será nulo no final, apenas por precaução, você usa
1. Desative o aviso.
2. Jogue o erro de exceção se o pior acontecer (quando você executa seu aplicativo).
Em algum momento, quando você compila seu código, não obtém seu resultado e é um bug. Mas o aplicativo não trava e você gasta muito tempo para encontrar onde está causando esse bug.
Então, se você colocar afirma, assim:
assert strA != null; //Adding here
strB = strA .toLowerCase();
Você diz ao compilador que Stra absolutamente não é um valor nulo, ele pode 'pacificamente' desligar o aviso. Se for nulo (o pior caso acontecer), ele interromperá o aplicativo e lançará um bug para você localizá -lo.
Use esta versão da instrução Assert para fornecer uma mensagem detalhada para o AssertionError. O sistema passa o valor da expressão2 para o construtor AssertionError apropriado, que usa a representação da string do valor como a mensagem de detalhes do erro.
O objetivo da mensagem detalhada é capturar e comunicar os detalhes da falha de asserção. A mensagem deve permitir que você diagnostique e, finalmente, corrige o erro que levou a afirmação a falhar. Observe que a mensagem de detalhes não é uma mensagem de erro no nível do usuário, por isso é geralmente desnecessário tornar essas mensagens compreensíveis isoladamente ou internalizá-las. A mensagem detalhada deve ser interpretada no contexto de um rastreamento de pilha completa, em conjunto com o código -fonte que contém a afirmação com falha.
As afirmações são geralmente usadas principalmente como um meio de verificar o comportamento esperado do programa. Isso deve levar a um acidente na maioria dos casos, uma vez que as suposições do programador sobre o estado do programa são falsas. É aqui que entra o aspecto de depuração das afirmações. Eles criam um ponto de verificação que simplesmente não podemos ignorar se gostaríamos de ter um comportamento correto.
No seu caso, ele faz validação de dados nos parâmetros recebidos, embora não impeça que os clientes usam indevidamente a função no futuro. Especialmente se não forem, (e não deve) ser incluído nas construções de liberação.
Garante que a expressão retorne verdadeira. Caso contrário, joga um java.lang.AssertionError
.
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10
Afirme -se um ASSERTIONError se você executar seu aplicativo com as afirmações ativadas.
int a = 42;
assert a >= 0 && d <= 10;
Se você executar isso com, digamos: java -ea -jar peiska.jar
Deve jogar um java.lang.assertionError