Quando estou estudando para a certificação, fico imaginando várias possibilidades de coisas estranhas que podem acontecer e talvez cair na prova.
Essa questão eu mesmo elaborei e fiquei em dúvida sobre qual resposta deveria ser a correta do ponto de vista da prova:
P: Assuma que o seguinte trecho de código foi compilado e executado habilitando assertions (texto típico da maioria das questões sobre Assertions hehe):
public class Assertions {
public static void main(String[] args) {
//código aqui...
assert expressão1 : expressão2;
//mais código aqui...
}
}
Se a expressão1 é avaliada como false e a expressão2 é tal que retorna algum valor (ou seja, não chama um método cujo retorno é void), em tempo de execução será lançada uma AssertionError?
(antes de dar a minha resposta, gostaria de saber qual resposta vocês dariam a uma questão como essa)
Só um detalhe: eu coloquei o código acima apenas pra facilitar no entendimento da pergunta. Mas pra ficar mais difícil, a pergunta poderia ser assim:
P. Assumindo que um trecho de código foi compilado e executado habilitando assertions, em uma linha onde temos
se a expressão1 for avaliada como false e a expressão2 é tal que retorna algum valor (ou seja, não chama um método cujo retorno é void), em tempo de execução será lançada uma AssertionError?
Pois então, segundo o material que a gente estuda em qualquer livro, inclusive o da Kathy, sobre Assertions, a resposta seria essa que vocês falaram. Porém, pensei em uma situação onde isso não acontece:
public static void main(String[] args) {
try{
System.out.println("antes");
assert false : lancaExcecao();
System.out.println("depois 1");
} catch(Exception e){}
System.out.println("depois 2");
}
public static String lancaExcecao() throws Exception{
throw new Exception();
}
Se vocês rodarem esse código, vai ser exibido no console:
antes
depois 1
depois 2
Ou seja, a expressão1 foi avaliada como false, a expressão2 retorna valor (para o compilador), porém, em tempo de execução, não foi lançado AssertionError. Se ao invés de tratarmos Exception, declarássemos que o main lança Exception, o programa abortaria lançando Exception (e não AssertionError, como muitos livros ensinam).
Por isso, gostaria de saber se a resposta de uma questão como essa, do ponto de vista da prova (pois já mostrei que na realidade isso não acontece), seria “É lançado AssertionError” ou “Depende da Expressão2 (pois se ela lançar exceção, AssertionError não vai ser lançada)”
Bom… eu vou dizer oq eu acho… creio a resposta para isso seja um AssertionError, mesmo q vc tenha mostrado q nesse caso nao gere um AssertionError, no livro da Kathy diz que a expressao tera q retornar um valor, nao creio q no exame havera questoes em q a o metodo da expressao2 gere excecao… acho q eles farao um metodo q retorne um valor msm… mas isso eh a minha opiniao… abraco…
o problema é que essa questão é independente de código (ou seja, na prova, por exemplo, não teria trecho de código para analisarmos)… a pergunta seria somente isso:
“Se a expressão1 for avaliada como false e a expressão2 é tal que retorna algum valor (ou seja, não chama um método cujo retorno é void), em tempo de execução será lançada uma AssertionError?”
Como mostrei, a resposta para isso seria “Depende da expressão2”, porém, como muitos livros vêm ensinando, sem pensar em um caso como esse, a resposta seria “lança AssertionError”. Portanto, fico com medo de em um caso como esse eu responder “Depende” e o gabarito ser “lança AssertionError”
Ah sim… Agora te entendi… Mas acho q tu deve assinalar AssertionError… Pq realmente todos os materiais sobre o assunto tratam essa questao como sempre AssertionError… Mas realmente se for analisar “realmente” o “depente” eh mais correto… Nao sei se estou certo me guiando pelo livro aqui da kathy, mas parece q ele foi feito assim bem nos moldes da prova… Nao se ajudei, dei soh minha opiniao… Abraco…
é na verdade não existiria por que fazer um código que lançasse uma exception no assertion, afinal de contas ela já é uma exception, mas entendi o que você quis dizer e concorco contigo, mas analisando pelo contexto acho que sempre que aparecer isso o melhor seria marcar que lança uma exception.
Tentei usar esse exemplo aqui mas nao consegui, acho que a versao do jdk aqui é antiga… mas vou fazer uns testes em casa … mas acho que é isso mesmo
Bom… eu vou dizer oq eu acho… creio a resposta para isso seja um AssertionError, mesmo q vc tenha mostrado q nesse caso nao gere um AssertionError, no livro da Kathy diz que a expressao tera q retornar um valor, nao creio q no exame havera questoes em q a o metodo da expressao2 gere excecao… acho q eles farao um metodo q retorne um valor msm… mas isso eh a minha opiniao… abraco…[/quote]
teve questoes de assertion o tempo todo… teve uma que o codigo compila executa normal. ele so lançaria uma exceção se fosse compilada com assertion habilitada mais como nao tava… nao houve problemas… teve outra que causava efeitos colaterais no programa… eu nunca vi tanta questao de assertion na minha vida… ele cobrou bastante ja que assertion é um novo recurso que está a partir da versao 1.4… nao foi dificil nao. porem com pegadinha…tipo as que falei…
a respeito do codigo… a expressao dois tem que retornar algum tipo menos void… senao o codigo nao compila… lembre-se que a expression2 é uma msg string… e void nao retorna a nada… e ali deve ter uma mensagem tipo:
assertion false: "a linha 2 foi configurada para false";
Só um detalhe que talvez vc tenha confundido: a expressão2 não precisa ser uma String. Pode ser QUALQUER coisa que retorne valor. Pode ser um literal int, um literal boolean, uma chamada a métodos que não tenha tipo de retorno void, etc.