SObrescrita - Duvida

10 respostas
G
SomeException:
1. public class SomeException {
2. }
Class A:
1. public class A {
2. public void doSomething() { }
3. }
Class B:
1. public class B extends A {
2. public void doSomething() throws SomeException { }
3. }
Which is true about the two classes?
A. Compilation of both classes will fail.
B. Compilation of both classes will succeed.
C. Compilation of class A will fail. Compilation of class B will succeed.
D. Compilation of class B will fail. Compilation of class A will succeed.

Resposta: D

Essa excecao 'SomeException' nao seria do tipo unchecked??? Pois sendo a classe B compilaria...

Testei compilando... mas o erro diz erro de tipo incompativel...

podem ajudar?

10 Respostas

R

a classe SomeException não herda de Exception por isso não pode ser lançada com exceção!

M

Bem, eu pensei que o override nesse caso nao daria certo porque o metodo orignal não lança exceção alguma. Alguma regra de override diz que não se pode lançar exceções nao declaradas no metodo original, ou exceções que sejam mais amplas…
Num é isso?

É olhei agora e vi que SomeException nao ‘extends Exception’ então não pode ser lançada como exceção… Mas caso ela fosse uma Exception ocorreria erro do mesmo jeito certo?

Lavieri

SomeException precisa extender Throwable, para poder ser lançado de um método

Murl:
Bem, eu pensei que o override nesse caso nao daria certo porque o metodo orignal não lança exceção alguma. Alguma regra de override diz que não se pode lançar exceções nao declaradas no metodo original, ou exceções que sejam mais amplas…
Num é isso?

não se pode… mas o fato é q vc so pode lançar objetos Throwable… não se pode lançar o que quiser… não é possivle lançar uma “Jaca!” de um método, apenas Throwables, Erros, Exceções e Runtime Exceptions são possiveis…

alem disso parte do q vc falou esta correto… o que não pode é lançar Checkd Exception não declaradas… ou seja… não se pode lançar nada que descenda de Exception e não de RuntimeException, e que não esteja declarado no método q vai ser sobrescrito… nem o que se descenda de Throwable e não descenda de Error ou RuntimeException

Lavieri

se extendesse Exception, daria o mesmo erro…

se extender RuntimeException, ou um de seus descendetes … não da erro e compila normal…

se extender Erro, ou um de seus descendetes tb não da erro

se extender Throwable diretamente tb da erro

Editado, pra corrigir throwable…

R

Bem observado, Murl. A sua colocação também procede.

M
class SomeException extends Throwable{   
}   
   
class A {   
public void doSomething(){ }   
}  
public class B extends A {  
    
    public void doSomething() throws SomeException { }   
}

erro: doSomething() in B cannot override doSomething() in A; overridden method does not throw SomeException

class SomeException extends RuntimeException{   
}   
   
class A {   
public void doSomething(){ }   
}  
public class B extends A {  
    
    public void doSomething() throws SomeException { }   
}

extends RuntimeException compila sem erro.

class SomeException extends Error{   
}   
   
class A {   
public void doSomething(){ }   
}  
public class B extends A {  
    
    public void doSomething() throws SomeException { }   
}

Compila sem erro.

Poderia falar um pouco mais o por que herdando de Error e RuntimeException o codigo compila sem erro?

G

Resumindo...

RunTimeException -> 'exceção' não-verificada, unchecked.
Exception -> 'exceção' verificada, checked.

1 - Pode declarar exceções não verificadas.
public class A {
	public void doSomeThing() {
	}
}
public class SomeException extends RuntimeException { // Error idem...
}
public class B extends A {
	public void doSomeThing() throws SomeException { //Compila pois a exceção é unchecked.
	}
}
2 - Não pode declarar exceções verificadas novas ou mais abrangentes.
public class A {
	public void doSomeThing() {
	}
}
public class SomeException extends Exception { //Throwable idem...
}
public class B extends A {
	public void doSomeThing() throws SomeException { 
// Não compila pois a exceção é checked. Ou você remove ou declara no método da classe A.
                    
	}
}
3 - Não reconhece o tipo da exceção.
public class A {
	public void doSomeThing() {
	}
}
public class SomeException {
}
public class B extends A {
	public void doSomeThing() throws SomeException { //Não compila pois não reconhece o tipo da exceção.
	}
}
M

Sim Throwable também da erro...

O unico jeito de fazer funcionar com exception seria:

class SomeException extends Exception{   
}   
   
class A {   
public void doSomething() throws Exception // ou SomeException
{ }   
}  
public class B extends A {  
    
    public void doSomething() throws SomeException { }   
}
Lavieri

vc não precisa capturar, um Error, pela razão obvia de que quando acontece um error, não tem o que se fazer, normalmente é uma situação sem volto… então vc so captura o Erro se quiser

se vc lançar um RuntimeException tb… pq exceções em tempo de execução são imprivesiveis… e não precisam ser verificadas… podem acontecer por razões adversas, e portanto não precisam ser obrigatoriamente tratadas, ou declaradas… por exemplo, vc não precisa verificar a todo momento que uma variavel é nula, porem isso pode ocorrer a todo instante…

M

Beleza guilherme. Deu pra sacar :smiley:

Criado 21 de maio de 2009
Ultima resposta 21 de mai. de 2009
Respostas 10
Participantes 4