Dúvida com uma Questão Sobre exceções  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
sidney.tavares
JavaBaby
[Avatar]

Membro desde: 09/04/2009 14:48:14
Mensagens: 96
Offline

Boa noite a todos os amigos, neste meu primeiro post do ano volto aqui para pedir ajuda em uma questão que encontrei em um simulado:



Daí vem as opções:



Eu marquei as opções A e D, a primeira porque não está lançando nenhuma exceção nova verificada e a segunda por estar lançando a mesma exceção, uma das que lança IOException eu não marquei por ser uma exceção mais genérica e o método não pode lançar e a outra porque não há sobrescrita, mas o teste diz que minha resposta está errada, vocês poderiam por favor me ajudar? Obrigado desde já, e feliz 2012 a todos.

Entusiasta Java
jakefrog
GUJ Expert
[Avatar]

Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline

E qual a pergunta dessa questão?

Vc colocou as opções e não a pergunta.

This message was edited 1 time. Last update was at 02/01/2012 19:55:43


Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]

SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)

Vamos em frente que atrás vem gente!
sidney.tavares
JavaBaby
[Avatar]

Membro desde: 09/04/2009 14:48:14
Mensagens: 96
Offline

Olá JakeFrog, cara, eu coloquei a pergunta como comentário no código, mas acredito já ter encontrado a resposta, NumberFormatException é uma exceção não verificada e portanto pode ser lançada pelo método que está sobrescrevendo, neste caso além das opções A e D, as opções E e F também compilam, fiz o que deveria ter feito antes de postar, fui olhar na documentação, só gostaria de me certificar se a minha conclusão está certa. valeu.

Entusiasta Java
ECO2004
JavaEvangelist
[Avatar]

Membro desde: 06/11/2006 01:11:23
Mensagens: 305
Offline

sidney.tavares wrote:Boa noite a todos os amigos, neste meu primeiro post do ano volto aqui para pedir ajuda em uma questão que encontrei em um simulado:



Daí vem as opções:



Eu marquei as opções A e D, a primeira porque não está lançando nenhuma exceção nova verificada e a segunda por estar lançando a mesma exceção, uma das que lança IOException eu não marquei por ser uma exceção mais genérica e o método não pode lançar e a outra porque não há sobrescrita, mas o teste diz que minha resposta está errada, vocês poderiam por favor me ajudar? Obrigado desde já, e feliz 2012 a todos.


Override é quando você usa a mesma assinatura de um método, mas varia a sua implementação. Assim, se você deseja fazer um override, não pode haver outras exception além das declaradas pelo método pai.

Bem, a letra A define um novo método, por causa da falta da FileNotFoundException. As letras B, D, E e F seguem o mesmo raciocínio. A única que muda é a letra C, pois você chama na main new Slave().doFileStuff(), sem passar qualquer parâmetro para o objeto. Assim, será chamado o método original, que foi herdado pela classe filha.

Espero ter ajudado!
[Email] [MSN] [ICQ]
joaoluizjoaquim
HelloWorld

Membro desde: 02/07/2011 00:02:36
Mensagens: 11
Localização: Florianópolis
Offline

As respostas certas são:
A
D
E
F

Explicação:

Quando fazer uma sobrescrita de um método que sinaliza uma exceção você deve lembrar:

  • Pode lançar as mesmas checked exceptions que foi declarada no método original.

  • Pode lançar uma parte dessas exceções.

  • Pode lançar subclasses da exceção sinalizada.

  • Pode lançar qualquer runtime exceptions.

  • Oracle Certified Professional, Java SE 6 Programmer
    ECO2004
    JavaEvangelist
    [Avatar]

    Membro desde: 06/11/2006 01:11:23
    Mensagens: 305
    Offline

    joaoluizjoaquim wrote:As respostas certas são:
    A
    D
    E
    F

    Explicação:

    Quando fazer uma sobrescrita de um método que sinaliza uma exceção você deve lembrar:

  • Pode lançar as mesmas checked exceptions que foi declarada no método original.

  • Pode lançar uma parte dessas exceções.

  • Pode lançar subclasses da exceção sinalizada.

  • Pode lançar qualquer runtime exceptions.


  • E a letra B?
    [Email] [MSN] [ICQ]
    sidney.tavares
    JavaBaby
    [Avatar]

    Membro desde: 09/04/2009 14:48:14
    Mensagens: 96
    Offline

    Bom dia ECO2004,

    A letra B esta incorreta porque o método sobrescrito não pode lançar uma exceção verificada nova ou mais abrangente do que o metodo original, neste caso IOException seria a exceção mais abrangente e deveria ter sido lancada na classe Master, acho que pra simplificar fica assim: FileNotFoundException e filha de IOException.

    Entusiasta Java
    ECO2004
    JavaEvangelist
    [Avatar]

    Membro desde: 06/11/2006 01:11:23
    Mensagens: 305
    Offline

    sidney.tavares wrote:Bom dia ECO2004,

    A letra B esta incorreta porque o método sobrescrito não pode lançar uma exceção verificada nova ou mais abrangente do que o metodo original, neste caso IOException seria a exceção mais abrangente e deveria ter sido lancada na classe Master, acho que pra simplificar fica assim: FileNotFoundException e filha de IOException.


    Esqueci que uma FileNotFoundException é derivada de uma IOException...

    Uma correção...o que está acontecendo com a letra B é um overload seguida de um override...o override ocorre por que o método tem o mesmo tipo de retorno e parâmetro (nenhum, no caso), enquanto que o overload ocorre quando uma nova exceção é assinada no método. Nesse caso, o overload sobrescreveu o método da classe pai.

    Override é sobrescrever. Overload é sobrecarregar.

    Se eu estiver errado, me corrijam!

    This message was edited 1 time. Last update was at 03/01/2012 08:50:29

    [Email] [MSN] [ICQ]
    sidney.tavares
    JavaBaby
    [Avatar]

    Membro desde: 09/04/2009 14:48:14
    Mensagens: 96
    Offline

    Eco2004,

    Cara, acho que você ta errado, se fosse sobrecarga compilaria, nao compila exatamente por ser sobrescrita, ou override,o que define a assinatura do método seria a lista de argumentos, e neste caso essa lista não foi alterada, ou seja, o método não tem argumentos. Para ser sobrecarregado ele deveria estar declarado assim:



    Abraco.

    Entusiasta Java
    ECO2004
    JavaEvangelist
    [Avatar]

    Membro desde: 06/11/2006 01:11:23
    Mensagens: 305
    Offline

    sidney.tavares wrote:Eco2004,

    Cara, acho que você ta errado, se fosse sobrecarga compilaria, nao compila exatamente por ser sobrescrita, ou override,o que define a assinatura do método seria a lista de argumentos, e neste caso essa lista não foi alterada, ou seja, o método não tem argumentos. Para ser sobrecarregado ele deveria estar declarado assim:



    Abraco.


    @sidney.tavares

    O método foi sobrescrito. Disse errado!
    Um método é sobrecarregado quando somente o seu parâmetro muda, em quantidade, ordem ou tipo. O tipo de retorno nem entra.

    Eu quis comprovar fazendo o seguinte. Pode-se notar que um objeto Slave recebe uma instância da classe Slave. Assim, primeiramente eu verifica se o método chamado se encontra em seu contexto (abrangendo os métodos herdados). Se eu criasse um objeto Master apontando para uma instância da classe Slave e depois invocasse o método doFileStuff(), primeiramente seria verificado se o método existe em Master para depois verificar se o mesmo foi override em Slave. Se fossem métodos diferentes e não o mesmo sobrescrito, ele invocaria o método da classe Master e depois iria ver que não existiria o mesmo sobrescrito em Slave e imprimiria "a". Mas isso não ocorreu. Ele imprimiu "b" da classe filha, contantando que realmente uma mudança de exceção somente não faz o método mudar.

    Eu só não sei o porquê de não ter aceitado uma exceção mais abrangente que a primeira. Você sabe o motivo?
    [Email] [MSN] [ICQ]
    sidney.tavares
    JavaBaby
    [Avatar]

    Membro desde: 09/04/2009 14:48:14
    Mensagens: 96
    Offline

    Olá Eco2004


    Eu só não sei o porquê de não ter aceitado uma exceção mais abrangente que a primeira. Você sabe o motivo?


    Bem, o motivo está na hierarquia, como IOException está acima de FileNotFoundExcepetion, a regra para sobrescrita de métodos diz que o método que sobrescreve não pode lançar uma exceção mais abrangente do que o método original, se isso acontecer o código não compila, não é que o método em si muda, mas uma regra da linguagem está sendo quebrada, esse assunto, sobrescrita e sobrecarga confunde mesmo, mas para essa questão em específico o que está sendo testado é se conhecemos as regras de sobrescrição e no caso da opção B esta regra está sendo quebrada, não sei se consegui me fazer entender, mas se ainda tiver dúvida estamos aí, abraço.

    Entusiasta Java
    ECO2004
    JavaEvangelist
    [Avatar]

    Membro desde: 06/11/2006 01:11:23
    Mensagens: 305
    Offline

    Está ok!

    Obrigado.
    [Email] [MSN] [ICQ]
    emelianenko
    Thread.start()
    [Avatar]
    Membro desde: 20/09/2011 08:30:12
    Mensagens: 38
    Offline

    sidney.tavares wrote:Olá Eco2004


    Eu só não sei o porquê de não ter aceitado uma exceção mais abrangente que a primeira. Você sabe o motivo?


    Bem, o motivo está na hierarquia, como IOException está acima de FileNotFoundExcepetion, a regra para sobrescrita de métodos diz que o método que sobrescreve não pode lançar uma exceção mais abrangente do que o método original, se isso acontecer o código não compila, não é que o método em si muda, mas uma regra da linguagem está sendo quebrada, esse assunto, sobrescrita e sobrecarga confunde mesmo, mas para essa questão em específico o que está sendo testado é se conhecemos as regras de sobrescrição e no caso da opção B esta regra está sendo quebrada, não sei se consegui me fazer entender, mas se ainda tiver dúvida estamos aí, abraço.


    simplificando, é uma regra sobre exceções, metodo sobrescrito não pode lançar exceção de tipo mais generico que o metodo de origem.
     
    Índice dos Fóruns » Certificação Java
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team