Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

Asserções Java

Declarações Java


Neste tutorial, aprenderemos sobre a declaração Java assert (asserções Java) com a ajuda de exemplos.

Asserções em Java ajudam a detectar bugs testando o código que supomos ser verdadeiro.

Uma asserção é feita usando o assert palavra-chave.

Sua sintaxe é:
assert condition;

Aqui, condition é uma expressão booleana que assumimos ser verdadeira quando o programa é executado.

Ativando declarações


Por padrão, as asserções são desabilitadas e ignoradas em tempo de execução.

Para habilitar asserções, usamos:
java -ea:arguments

OU
java -enableassertions:arguments

Quando as asserções estão habilitadas e a condição é true , o programa é executado normalmente.

Mas se a condição for avaliada como false enquanto as asserções estão habilitadas, a JVM lança um AssertionError , e o programa pára imediatamente.

Exemplo 1:declaração Java

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length == 2;
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}

Saída
There are 3 weekends in a week

Obtemos a saída acima porque este programa não possui erros de compilação e, por padrão, as asserções estão desabilitadas.

Após habilitar as assertivas, obtemos a seguinte saída:
Exception in thread "main" java.lang.AssertionError

Outra forma de declaração de afirmação

assert condition : expression;

Nesta forma de declaração de asserção, uma expressão é passada para o construtor do AssertionError objeto. Esta expressão tem um valor que é exibido como a mensagem de detalhes do erro se a condição for false .

A mensagem detalhada é usada para capturar e transmitir as informações da falha de asserção para ajudar na depuração do problema.

Exemplo 2:asserção Java com exemplo de expressão

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week";
    System.out.println("There are " + weekends.length + "  weekends in a week");
  }
}


Saída
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

Como vemos no exemplo acima, a expressão é passada para o construtor do AssertionError objeto. Se nossa suposição for false e as asserções são habilitadas, uma exceção é lançada com uma mensagem apropriada.

Essa mensagem ajuda a diagnosticar e corrigir o erro que causou a falha da asserção.

Habilitando asserção para classes e pacotes específicos


Se não fornecermos nenhum argumento para as opções de linha de comando de asserção,
java -ea

Isso habilita asserções em todas as classes, exceto classes de sistema.

Também podemos habilitar a asserção para classes e pacotes específicos usando argumentos. Os argumentos que podem ser fornecidos a essas opções de linha de comando são:

Ativar declaração em nomes de classe

Para habilitar a asserção para todas as classes do nosso programa Main,
java -ea Main

Para habilitar apenas uma classe,
java -ea:AnimalClass Main

Isso permite a afirmação apenas no AnimalClass no Main programa.



Ativar declaração em nomes de pacotes

Para habilitar asserções para o pacote com.animal e seus subpacotes apenas,
java -ea:com.animal... Main

Ativar declaração em pacotes sem nome

Para habilitar a asserção em pacotes sem nome (quando não usamos uma instrução de pacote) no diretório de trabalho atual.
java -ea:... Main

Ativar asserção nas classes do sistema

Para habilitar a asserção nas classes do sistema, usamos uma opção de linha de comando diferente:
java -esa:arguments 

OU
java -enablesystemassertions:arguments

Os argumentos que podem ser fornecidos a essas opções são os mesmos.

Desativando declarações


Para desabilitar asserções, usamos:
java -da arguments 

OU
java -disableassertions arguments

Para desabilitar a asserção nas classes do sistema, usamos:
java -dsa:arguments

OU
java -disablesystemassertions:arguments

Os argumentos que podem ser passados ​​ao desabilitar asserções são os mesmos ao habilitá-los.

Vantagens da afirmação

  1. Rápido e eficiente para detectar e corrigir bugs.
  2. As verificações de asserção são feitas apenas durante o desenvolvimento e o teste. Eles são removidos automaticamente no código de produção em tempo de execução para que não atrase a execução do programa.
  3. Ajuda a remover o código clichê e torná-lo mais legível.
  4. Refatora e otimiza o código com maior confiança de que ele funciona corretamente.

Quando usar asserções

1. Códigos inacessíveis


Códigos inacessíveis são códigos que não são executados quando tentamos executar o programa. Use asserções para garantir que os códigos inacessíveis sejam realmente inalcançáveis.

Vamos dar um exemplo.
void unreachableCodeMethod() {
  System.out.println("Reachable code");
  return;
  // Unreachable code
  System.out.println("Unreachable code");
  assert false;
}

Vamos dar outro exemplo de uma instrução switch sem um caso padrão.
switch (dayOfWeek) {
  case "Sunday":
    System.out.println("It’s Sunday!");
    break;
  case "Monday":
    System.out.println("It’s Monday!");
    break;
  case "Tuesday":
    System.out.println("It’s Tuesday!");
    break;
  case "Wednesday":
    System.out.println("It’s Wednesday!");
    break;
  case "Thursday":
    System.out.println("It’s Thursday!");
    break;
  case "Friday":
    System.out.println("It’s Friday!");
    break;
  case "Saturday":
    System.out.println("It’s Saturday!");
    break;
}

A instrução switch acima indica que os dias da semana podem ser apenas um dos 7 valores acima. Não ter caso padrão significa que o programador acredita que um desses casos sempre será executado.

No entanto, pode haver alguns casos que ainda não foram considerados em que a suposição é realmente falsa.

Essa suposição deve ser verificada usando uma asserção para garantir que o caso de comutação padrão não seja alcançado.
default:
    assert false: dayofWeek + " is invalid day";

Se diaDaSemana tem um valor diferente dos dias válidos, um AssertionError é lançado.

2. Documentando suposições


Para documentar suas suposições subjacentes, muitos programadores usam comentários. Vamos dar um exemplo.
if (i % 2 == 0) {
    ...
} else { // We know (i % 2 == 1)
    ...
}

Use afirmações em vez disso.

Os comentários podem ficar desatualizados e fora de sincronia à medida que o programa cresce. No entanto, seremos forçados a atualizar o assert declarações; caso contrário, eles também podem falhar para condições válidas.
if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}

Quando não usar asserções

1. Verificação de argumentos em métodos públicos


Argumentos em métodos públicos podem ser fornecidos pelo usuário.

Portanto, se uma asserção for usada para verificar esses argumentos, as condições podem falhar e resultar em AssertionError .

Em vez de usar asserções, deixe que resulte nas exceções de tempo de execução apropriadas e trate essas exceções.

2. Para avaliar expressões que afetam a operação do programa


Não chame métodos ou avalie exceções que possam afetar posteriormente a operação do programa em condições de asserção.

Vamos dar um exemplo de uma lista dias da semana que contém os nomes de todos os dias de uma semana.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

assert weekdays.removeAll(weekends);

Aqui, estamos tentando remover elementos Saturday e Sunday da ArrayList dias da semana .

Se a asserção estiver habilitada, o programa funciona bem. No entanto, se as asserções estiverem desabilitadas, os elementos da lista não serão removidos. Isso pode resultar em falha do programa.

Em vez disso, atribua o resultado a uma variável e, em seguida, use essa variável para asserção.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));

ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));

boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;

Desta forma, podemos garantir que todos os fins de semana são removidos dos dias da semana independentemente da asserção estar habilitada ou desabilitada. Como resultado, não afeta a operação do programa no futuro.

Java

  1. Operadores Java
  2. Comentários Java
  3. Java if... else Declaração
  4. Java para cada loop
  5. Strings Java
  6. Interface Java
  7. Classe anônima Java
  8. Java try-with-resources
  9. Anotações Java
  10. Vetor Java