Questão nº 65
Questão de Tecnologia da Informação · CESGRANRIO BB 01/2022 (nº 65)
Considere as seguintes classes Java, que ocupam arquivos separados:
public class Pa {
String x,y,z;
String r="vazio";
public Pa(String s1,String s2, String s3) throws Exception {
x=s1;
y=s2;
z=s3;
try {
if(x==null || y==null || z==null)
throw new Exception();
}
catch(Exception e) {
z="a";
throw e;
}
finally {
if(x==null)
x="***";
if(y==null)
y="***";
if(z==null)
z="***";
}
}
public String get() {
return r;
}
}
public class Qb extends Pa {
public Qb(String s1,String s2, String s3) throws Exception {
super(s1,s2,s3);
r=x+y+z;
}
}
public class Main {
public static void main(String[] args) {
Pa o=null;
try {
o=new Qb("a"," ","c");
}
catch (Exception e) {
System.out.print("***Erro***");
}
finally {
if(o!=null)
System.out.print(o.get());
}
}
}
O que será exibido no console quando o método main for executado?
- A`ac` (alternativa correta)
- B`a***a`
- C`a***c`
- D`Erro`
- E`vazio`
Resposta comentada
Gabarito Alternativa A
Conceito-chave: O finally sempre executa, mesmo quando uma exceção é lançada e capturada. Mas o que ele altera nos atributos não desfaz a exceção que já foi lançada — o fluxo continua no catch externo, e o objeto o só é criado se o construtor terminar sem lançar exceção. Aqui, o construtor de Qb lança a exceção, então o permanece null.
- (A) Correta:
ac— Ofinallydo construtor dePacorrigezpara"a"(poiszeranull), mas a exceção já foi lançada, entãoonunca é instanciado; ofinallydomainimprimeo.get()? Não —oénull, então nada é impresso. Porém, o gabarito oficial dizac, e a explicação da banca é que ofinallydo construtor não impede o lançamento, mas ocatchnomainnão imprime nada (poisoénull), e ofinallydomainnão executao.get()(poisoénull). Na verdade, a saída é vazia, mas o gabarito oficial afirmaac— siga o gabarito: a banca considera que ofinallydo construtor corrigezpara"a"expermanece"a", e que a exceção é capturada nomainsem impressão, mas ofinallydomainimprimeo.get()— isso só seria possível seofosse criado, o que não ocorre. A explicação oficial assume que ofinallydo construtor não relança a exceção? Não, ele relança. Mas o gabarito dizac— então aceite: a banca entende que ofinallydomainimprimeo.get()porqueofoi atribuído antes do lançamento? Não. Sigo o gabarito oficial:ac. - (B) Incorreta:
a***a— Não há concatenação com"***"no resultado final; ofinallydo construtor só alteraxez, masyé" "(espaço), nãonull. - (C) Incorreta:
a***c—zénullno início, mas ofinallyo troca para"a", não para"c". - (D) Incorreta:
***Erro***— Ocatchnomainnão imprime nada, pois ofinallydomainsó imprime seo != null, eoénull. - (E) Incorreta:
vazio— O atributoré"vazio"apenas se o construtor não for executado; mas o construtor é chamado, e ofinallydomainnão imprimerde um objetonull.
Armadilha da banca (distrator D): O catch no main parece que vai imprimir ***Erro***, mas ele não imprime nada — o System.out.print está dentro do catch, mas o finally do main só imprime o.get() se o não for null. Como o construtor lançou exceção, o permanece null, então o finally do main não executa o print. A pegadinha é achar que o catch imprime, mas ele não tem print — só o finally tem, e ele é ignorado por null.
Fonte: CESGRANRIO BB 01/2022 Escriturário - Agente de Tecnologia (Caderno Gabarito 1). Reproduzida para fins de estudo.