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);
}
Foi útil?

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 é um assert 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 para false. 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.

Javadoc

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top