Dúvida Interessante - throw  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thundercas
JavaEvangelist
[Avatar]

Membro desde: 15/09/2007 11:04:51
Mensagens: 429
Localização: São Paulo - SP
Offline

Fala galera, beleza???

Estou com a seguinte dúvida... Peço que observem os 2 trechos de código abaixo:



#################




A dúvida é a seguinte: Qual a diferença no tratamento da exceção nos 2 casos acima??? Teoricamente, os 2 trechos deveriam efetuar exatamente o mesmo tratamento, não???

A impressão q tenho é ao utilizar o throw o código abaixo de chave que fecha o catch não é executado, já quando ocorre a exceção naturalmente, o trecho pós catch é executado normalmente... É isso mesmo?? Mas não deveriam ser iguais os tratamentos??

Se alguém puder esclarecer, ficarei agradecido

Abraços a todos e obrigado...

Cassiano Colombo de Oliveira Gil
Analista Programador Junior
São Paulo - SP
E-mail: cassi_ano@hotmail.com
Twiter: http://twitter.com/thundercas
[Email] [MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Impressão não é prova. Prove a sua afirmação, executando os trechos de código que você postou.
[WWW]
bKn
Java Ninja

Membro desde: 07/04/2009 15:22:18
Mensagens: 288
Offline

Ambos continuam rodando. Não confunda as coisas, você apenas trata a exceção dentro do catch. Lançar uma exceção não é tratar nada.
aleck
GUJ Ranger
[Avatar]

Membro desde: 27/03/2006 08:08:33
Mensagens: 843
Localização: Rio de Janeiro
Offline

No primeiro caso vc está capturando um erro de execução, no segundo vc está repassando este erro para a classe que chamou o método.

Desenvolvedor iOS/Android
http://blog.alexandresoli.com.br
@alexandresoli
[WWW] [MSN]
MaikoID
JavaChild
[Avatar]

Membro desde: 26/11/2007 23:02:21
Mensagens: 111
Offline

Opa agora me veio uma dúvida.

O codigo


È executado ?

Porque se a exception é lancada no parseInt(x); ele não deveria pular a execução para o tratamento da exception ?

abraço.

thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline



Rodando seu código, você pode ver que a sua afirmação é incorreta.
[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

MaikoID wrote:Opa agora me veio uma dúvida.

O codigo


È executado ?

Porque se a exception é lancada no parseInt(x); ele não deveria pular a execução para o tratamento da exception ?

abraço.


Conforme você viu no código que você postou, o código será executado porque não houve uma exceção sendo lançada no parseInt (s). (Não há uma variável chamada "x" no seu programa; tomei a liberdade de corrigir).


[WWW]
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline

aleck wrote:No primeiro caso vc está capturando um erro de execução, no segundo vc está repassando este erro para a classe que chamou o método.


Passando para a classe que chamou?

Olhe isso aqui:

O que está acontecendo?

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
vitor lima
JavaBaby
[Avatar]

Membro desde: 14/04/2009 09:16:59
Mensagens: 92
Offline

Bem, quando você lança uma exeção fazendo

throw new <nomeDaClasseDeExceção>(<argumento> );

é criada uma nova exceção que fica esperando para ser tratada, o que geralmente ocorre
na classe que chamou o método criador da exceção, mas no seu caso, o primeiro lugar em que ela
pode ser tratada é no próprio catch do seu try/catch.
Por isso a exceção não é lançada.

Se você mudar a linha catch ( ClassCastException exc ) {
para por exemplo catch( NumberFormatException z){
a exceção não será tratada, e portanto, será lançada.

Coloquei seu código em um método a parte só para demonstrar no
método main o tratamento da exceção lançada.




public class TestaTryCatch {

public static void main(String[] args ) {
try{
testa();
}catch(Exception e){
System.out.println("Lançamento funcionou!");
}

}


public static void testa(){
try {
throw new ClassCastException( "exemplo " );

} catch ( ArrayIndexOutOfBoundsException exc ) {
System.out.print( exc.getMessage() );

try {
throw new NumberFormatException( "de exceções " );

} catch ( NumberFormatException excn ) {
System.out.print( excn.getMessage() );

try {
throw new ArrayIndexOutOfBoundsException( "aninhadas" );

} catch ( ArrayIndexOutOfBoundsException exca ) {
System.out.println( exca.getMessage() );
}
}
}
}
}
aleck
GUJ Ranger
[Avatar]

Membro desde: 27/03/2006 08:08:33
Mensagens: 843
Localização: Rio de Janeiro
Offline

davidbuzatto wrote:
Passando para a classe que chamou?


Erro meu de interpretação, pensei que o thundercas estava com dúvida no conceito de catch e throw.

De qualquer forma a dúvida dele já foi muito bem respondida pelo vitor lima.

Desenvolvedor iOS/Android
http://blog.alexandresoli.com.br
@alexandresoli
[WWW] [MSN]
vitor lima
JavaBaby
[Avatar]

Membro desde: 14/04/2009 09:16:59
Mensagens: 92
Offline

Quanto a dúvida do cara com uma foto de um cão jogando CS
(bela foto, muito boa mesmo . . .) ,
o MaikoID


" Opa agora me veio uma dúvida.
O codigo


throw new NumberFormatException("Erro");


È executado ?

Porque se a exception é lancada no parseInt(x); ele não deveria pular a execução para o tratamento da exception ?

abraço"




eu fiz o seguinte teste:

[code]

O System.out.println() que está dentro do try não é executado,portanto
a linha de código que lança a exceção também não é.
A execução vai direto para o catch como você havia observado.

MaikoID
JavaChild
[Avatar]

Membro desde: 26/11/2007 23:02:21
Mensagens: 111
Offline

Primeiro nem fui eu postei o código, me confudiram ali em cima.
Segundo vlw pela foto, e isso é um urso, da uma olhada no fucinho aushusahusa!
Terceiro imagina que eu tenha o seguinte codigo

Tem a seguinte saida

run:
Isso sim é um numero sangue bão 1
Numerinho sem vergonha que presta pra porra nenhuma -1
BUILD SUCCESSFUL (total time: 0 seconds)


Digamos eu posso usar as excecoes ao invés de controle por variavel para o controle de fluxo ? Fica muito lento digamos se um método quando dá algum erro de regra de negocio mandar uma exceção ou setar a variável de retorno com -1. e testar com um if depois ?

Exemplificando

Lógico que é um exmplo ridiculo, mas neste caso é preferivel o primeiro metodo pois fica mais legivel. O que eu não sei é se é sacrificado muito desempenho em comparação aos if's do segundo.

Abraço.

ps: criando esses metodos eu aprendi que não é preciso ter um throws na declaração do método para a exception ser tratado no método que o chamou rsrs.

 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team