Exercício de concurso - exceções

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());
}
}

Qual será o valor exibido no console quando a função main for executada?

Podem dar uma ajuda, já entendi como funciona as exceções, não estou entendendo o exercício

O que você não está entendendo?
Tente executar o código, se não conseguir põe no papel…

acho q o interessante é executar o algoritmo de cabeça. rsrs.

acho q exibiria 8.

[quote=GilsonNunes]acho q o interessante é executar o algoritmo de cabeça. rsrs.

acho q exibiria 8.[/quote]

não tinha visto o finally.

agora acho q 17

Printa 17

:shock: credo que coisa horrorosa é essa ?

pelo codigo será impresso 17, mas …

este codigo ñ ajuda ninguem a compreender nada.
ta muito confuso.

demita seu prof ou jogue fora o livro q estiver lendo.

[quote=Rodnei] :shock: credo que coisa horrorosa é essa ?

pelo codigo será impresso 17, mas …

este codigo ñ ajuda ninguem a compreender nada.
ta muito confuso.

demita seu prof ou jogue fora o livro q estiver lendo.
[/quote]

eu creio q o intuito do código não era ensinar programar, mas “testar” a interpretação.
por isso a complicação.

[quote=GilsonNunes][quote=Rodnei] :shock: credo que coisa horrorosa é essa ?

pelo codigo será impresso 17, mas …

este codigo ñ ajuda ninguem a compreender nada.
ta muito confuso.

demita seu prof ou jogue fora o livro q estiver lendo.
[/quote]

eu creio q o intuito do código não era ensinar programar, mas “testar” a interpretação.
por isso a complicação.

[/quote]

até concordo com vc GilsonNunes, mas este codigo ñ tem padrão, e utilizar exceções para fazer trabalho de if
acaba por gerar mais confusão do que ajudar no estudo e na interpretação.

se a intenção é o estudo de exceções existem exemplos muito mais esplicativos, praticos e objetivos.
se a questão for interpretação nada melhor que algoritimo e teste de mesa.

Aproveitando o tópico, analisem essa questão:

[code]public class Pai {
String nome = “Pai”;

public void imprime() {
	System.out.println(nome);
}

}[/code]

[code]public class Filho extends Pai {
String nome = “Filho”;

public void imprime() {
	System.out.println(nome);
}

}[/code]

public class Heranca { public static void main(String[] args) { Filho filho = new Filho(); System.out.println(filho.nome); filho.imprime(); Pai pai = filho; System.out.println(pai.nome); pai.imprime(); } }

Qual a saída no console?

[code]a) Filho
Filho
Pai
Filho

b) Filho
Filho
Pai
Pai

c) Filho
Filho
Filho
Filho

d) Filho
Filho
Filho
Pai[/code]

    public class Heranca {  
        public static void main(String[] args) {  
            Filho filho = new Filho();  
            System.out.println(filho.nome);  //imprime o atributo nome de filho
            filho.imprime();  //chama  o metodo imprime que imprime o atributo de filho
            Pai pai = filho;  // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho
            System.out.println(pai.nome);  //imprime o atributo de pai 
            pai.imprime();  //chama o metodo imprime de pai que imprime o atributo de filho
        }  
    }  

logo a resposta é

(a)Filho
Filho
Pai
Filho

Eu não entendi o a e variável x, como ela é private a classe a qual a variavel, é que fiquei bem confuso com os tratamentos de erros que ainda não entendo tão bem. Se entendi a variável x pode ser vista e acessada por todos, pois está dentro da classe principal onde ela foi criada, menos a classe q01 onde está o main. O resto é tudo public. Outra coisa que não entendi foi a classe teste, ela não é superclasse, então como as outras funções tratam a variável x?

É horroroso mesmo! Vou estudar melhor esta parte para poder entender o melhor, principalmente exceções e os métodos. Fico confuso, pois posso aplicar modificadores a variáveis. métodos, classes, objetos, etc. E piora quando são aninhados ou tem uma superclasse. Ai que eu me dano todo.

Valeu pela ajuda Guj Ranger, entendi que é um péssimo exemplo, arrrghhh. Espero que na próxima não caia um exercício deste tipo na prova. Vou fazer a prova do TJ e do TRF. As duas pedem java.

[quote=Rodnei] public class Heranca { public static void main(String[] args) { Filho filho = new Filho(); System.out.println(filho.nome); //imprime o atributo nome de filho filho.imprime(); //chama o metodo imprime que imprime o atributo de filho Pai pai = filho; // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho System.out.println(pai.nome); //imprime o atributo de pai pai.imprime(); //chama o metodo imprime de pai que imprime o atributo de filho } }

logo a resposta é

(a)Filho
Filho
Pai
Filho[/quote]

    public class Heranca {  
        public static void main(String[] args) {  
            Filho filho = new Filho();  
            System.out.println(filho.nome);  //imprime o atributo nome de filho
            filho.imprime();  //chama  o metodo imprime que imprime o atributo de filho
            Pai pai = filho;  // var pai RECEBE a referencia de  filho;
            System.out.println(pai.nome);  //imprime o atributo de pai 
            pai.imprime();  //chama o metodo imprime [b]sobrescrito[/b] em filho //polimorfismo é exatamente isso. não?
        }  
    }  

Eu consegui entender o comportamento do Java.
Mas achei estranho, porque a classe Filho não tem diretiva de Override (Acho que isso nem é utilizado no java, tem annotation @Override mas é outra história).
No Pascal e .Net o override tem que ser explicito, precedido de um modificador virtual na classe Pai.

[quote=brunog3]Eu consegui entender o comportamento do Java.
Mas achei estranho, porque a classe Filho não tem diretiva de Override (Acho que isso nem é utilizado no java, tem annotation @Override mas é outra história).
No Pascal e .Net o override tem que ser explicito, precedido de um modificador virtual na classe Pai. [/quote]

na realidade o @Override não é apenas um annotation, é vc “explicitando” o override.

eu particularmente prefiro ele explicito.

pq se vc errar o nome do metodo a ser sobrescrito, com o @override, vai gerar um erro de compilação.
e sem ele, simplesmente entenderia como um outro metodo.
e não pense q não é comum o erro de digitação, esses dias mesmo teve um caso aki no guj q o prob era exatamente o nome do metodo errado e, por isso, não fazia o override.

[quote=GilsonNunes][quote=Rodnei] public class Heranca { public static void main(String[] args) { Filho filho = new Filho(); System.out.println(filho.nome); //imprime o atributo nome de filho filho.imprime(); //chama o metodo imprime que imprime o atributo de filho Pai pai = filho; // cria um novo objeto pai do tipo Pai e carrega com o objeto filho instacia de Filho System.out.println(pai.nome); //imprime o atributo de pai pai.imprime(); //chama o metodo imprime de pai que imprime o atributo de filho } }

logo a resposta é

(a)Filho
Filho
Pai
Filho[/quote]

    public class Heranca {  
        public static void main(String[] args) {  
            Filho filho = new Filho();  
            System.out.println(filho.nome);  //imprime o atributo nome de filho
            filho.imprime();  //chama  o metodo imprime que imprime o atributo de filho
            Pai pai = filho;  // var pai RECEBE a referencia de  filho;
            System.out.println(pai.nome);  //imprime o atributo de pai 
            pai.imprime();  //chama o metodo imprime [b]sobrescrito[/b] em filho //polimorfismo é exatamente isso. não?
        }  
    }  

[/quote]

sim, dissemos a mesma coisa de formas diferentes.

Acho que ele não quer as respostas mas entender a proposta do exercício.
Pessoalmente, acho este tipo de construção ridículo, só serve para atrapalhar e demonstrar maus exemplos.

O exercício começa no Main:

public class Q01 { public static void main(String[] args){ Teste t=new Teste(1,2); //Cria a classe teste onde x = 1 + 2 --> 3 t.m1(5); //chama método m System.out.println(t.getX()); //Obtém o valor de x que foi iniciado no construtor e transformado no método m. } }
Até aqui, acho que está tranquilo.
O problema é o método m!

[code]public void m1(int a) {
int p;

	try {  //INICIA O BLOCO TRY - CATCH
		p = x % a;
		if (p < 4)
			throw new Exc01();  // DISPARA UMA NOVA EXCEÇÃO
	} catch (Exc01 e) {
		x += 5;
		return;
	} catch (Exception e) {
		x += 7;
		return;
	} finally {
		x += 9;
	}
	return;
}[/code]

O trecho: if (p < 4) throw new Exc01(); // DISPARA UMA NOVA EXCEÇÃO
dispara a exceção, porém a mesma está dentro de um bloco try-catch, ou seja, será tratada pela mesma. Caso as clausulas catch não se responsabilizem pelo tratamento é que a exceção seria encaminhada para fora do método. Mas a exceção é tratada: } catch (Exc01 e) { x += 5; return; } e tem um return terminando o método. Mas o método só é realmente terminado após passar pelo finally (opcional no bloco try-catch, mas quando presente sempre é chamado): } finally { x += 9; }

Aqui, a exceção é usada como se fosse um if (por isso considero essa construção ridicula e um péssimo exemplo.