public class Donkey {
public static void main (String [] args) {
boolean assertsOn = false;
assert (assertsOn) : assertsOn = true;
if (assertsOn) {
System.out.println("assert is on");
}
}
}
O que acontecerá se esse programa for executado duas vezes, a primeira com assertions desabilitadas e a segunda habilitadas?
Resultado: > Nenhuma saída e…
> AssertionError
Seria por que quando as assertions não estão habilitadas a JVM ignora o comando "assert" ?
Senão, não entendi o resultado…
Basicamente o que vc disse está correto, as assertions só tem efeito quando vc passa o argumento para a JVM, e quando o valor avaliado é falso ele lança o erro.
public class Donkey {
public static void main (String [] args) {
boolean assertsOn = false; //declara assertsOn = false
assert (assertsOn) : assertsOn = true; //asserts desabilitadas, não faz nada
if (assertsOn) { // assertsOn está a false, não entra no if
System.out.println("assert is on");
}
//nunca vai imprimir nada porque não entrou no if
}
}
Com asserts on:
public class Donkey {
public static void main (String [] args) {
boolean assertsOn = false; //declara assertsOn = false
assert (assertsOn) : assertsOn = true; //asserts habilitadas, checa a expressão dentro de () que vai dar false. Como deu false vai lançar um erro com a expressão depois dos dois pontos
// deu erro atrás não executa mais nada
if (assertsOn) {
System.out.println("assert is on");
}
}
}
O teu erro foi pensar que se a expressão for false ele executa o que está depois dos dois pontos e continua. Se der erro, aborta a execução e lança como mensagem de erro o que está depois dos dois pontos. Como tens uma atribuição, isso não terá qualquer valor.