Bem galera até o momento estudei que não é apropriado colocar assertivas para validar argumentos de métodos públicos e numa instrução case. A questão abaixo diz totalmente ao contrário.
Para mim, a resposta certa seria a letra D ao invés de G.
Tirei a certificação ano passado estudando pelo livro do Paul Sanghera, da Apress. Nele, é dito o seguinte sobre ASSERTIONS:
* Não utilize ASSERTIONS para verificar os argumentos passados para um método público. Existem duas razões para não fazer isso:
** Se a verificação de argumento é necessária, ela deve fazer parte das especificações do método e deve tornar-se parte do comportamento do método permanente. Lembre-se que as ASSERTIONS não são sempre ativada durante a execução.
** Passagem de argumentos errôneos deve resultar em exceções mais específicas e adequadas como IllegalArgumentException, IndexOutOfBoundsException, ou
NullPointerException. Isto também implica que você não deve usar as ASSERTIONS para verificar os argumentos de linha de comando.
Isso mata a linha 12, mas não restringe a 18.
* Não use ASSERTIONS para impor o bom funcionamento exigidas pelo seu aplicativo porque, novamente, elas podem não ser ativadas durante a execução do aplicativo. Você não quer
contar com ASSERTIONS para verificar o comportamento correto de sua aplicação em execução. Por exemplo, você quer ter certeza de que um myList não possui elementos nulos. Fazendo o seguinte é um uso inadequado das ASSERTIONS:
Essa mudança não vai acontecer se as ASSERTIONs estiverem desabilitadas.
Acho que isso mata a linha 15, pois está verificando o comportamente da aplicação.
Não implica aqui.
Enfim… concordo com você, acho que a resposta correta é a 18. Tente procurar uma ERRATA do livro da Kathy Sierra.
Abraço.
Nykolas_Lima
A linha 12 está errada pq voce está verificando um argumento passado para um método público.
A linha 15 está correta, quando você tem um ponto de seu código que você sabe que não pode cair, por exemplo, eu tenho um switch case, e ele NÃO pode cair no default.
Então eu coloco um assert(false) no default, o que quer me dizer, se cair nesse ponto que eu sei que NÃO pode cair, me lance um erro de assertion.
Portanto a linha 15 está correta.
A linha 18 está correta porque está verificando um argumento de um método private.