SóProvas


ID
606154
Banca
CESGRANRIO
Órgão
FINEP
Ano
2011
Provas
Disciplina
Programação
Assuntos

Sejam as seguintes classes Java:
public class Teste {
      private int x;

      public Teste() {
            x=10;
      }
      public Teste(int c,int d) {
            x=c+d;
      }
      public int getX() {
            return x;
      }
      public void m1(int a) {
            int p;

            try {
                  p=x%a;
                  if(p<4)
                     throw new Exc01();
            }
            catch(Exc01 e) {
                  x+=5;
                  return;
            }
            catch(Exception e) {
                  x+=7;
                  return;
            }
            finally {
                  x+=9;
            }
            return;
      }
}
public class Q01 {
      public static void main(String[] args){
            Teste t=new Teste(1,2);
            t.m1(5);
            System.out.println(t.getX());
      }
}
O que será exibido no console quando da execução da função main() acima?

Alternativas
Comentários
  • Esta questão nao pertence a disciplina de Portugues. 
    É de Analise de Sistemas, Programação, JAVA.
  • LETRA B.

    Construtor recebe 1 e 2 como parâmetros que no código em questão soma os parâmetros recebidos, nesse caso 3.
    O método ml() recebe 5 como parâmetro que soma com o número 3.
    Como o finally é obrigatório acrescenta mais 9 que dá 17.
  • Pessoal, o comentário do nosso amigo anterior faltou o principal, portanto vamos recomeçar, mas dessa vez, linha a linha.
    Portanto, iniciando o método main() temos:

     Teste t=new Teste(1,2); 

    Neste momento na variável x é armazenado o valor 3, resultado de 1+2 (
    x=c+d)

     t.m1(5);

    Aqui está o segredo da questão: neste momento o método m1 é chamado para execução.
    na linha 
    p=x%a; o valor de p será igual ao resultado de 3%5 que é o mesmo de 3 mod 5 na matemática.
    Resultado da equação: p=2 que é menor que 4, certo?
    Verificando a próxima linha de execução, temos:  
    if(p<4) throw new Exc01();
    Neste momento é lançada uma exceção que é logo tratada no mesmo método:


    catch(Exc01 e) 

    Onde é acrescentado o valor 5 à variável x. Temos então x=3+5=8.
    E então é terminado o bloco da exceção e executado o bloco do finally.


    finally {

    Neste bloco, é acrescentado 9 a x, x = 8+9 = 17.

    E 17 é o valor final de x, que é impresso no último comando do método main:


    System.out.println(t.getX());

    Bons estudos.
  • ZX obrigado pelo xinezinho!
    A explicacao foi extreamente didatica! Esclareceu todas as minhas duvidas. Eu estava adicioanndo 7 a X achando que ele caia no segundo bloco de excessao. Valeu!
  • Corrigindo um dos comentários acima, o operador a % b (equivalente ao MOD) retorna o resto da divisão inteira entre a e b, logo o resultado da expressão 3%5 ´é 3 e não 2.
  • O x da questão era se o finally seria executado ou não por causa do return. É garantida a execução do bloco finally caso o bloco try seja terminado via os comandos return, break ou continue. Porém, o bloco finally não será executado quando o código de try ou catch emitir um System.exit().
  • Só corrigindo o comentário de um amigo que disse "na linha p=x%a; o valor de p será igual ao resultado de 3%5 que é o mesmo de 3 mod 5 na matemática daria 2", está incorreto pois 3%5= 3, é só rodar o código abaixo:

    public class Programa {

          public static void main(String[] args){

                 System.out.println(3%5);   }


    Eu sei que não muda o resultado da questão, mas pode dar o intendimento errado a outro companheiro, bons estudos a todos.