Pra que server throws li no livro da deitel mas não entendi e fiz até esse exemplo:
publicclassTestes{publicstaticintquociente(intx,inty)throws(e){returnx/y;}publicstaticvoidmain(String[]args){try{intx=Integer.parseInt(JOptionPane.showInputDialog("Dígite o numerador"));inty=Integer.parseInt(JOptionPane.showInputDialog("Dígite o denominador"));System.out.print(quociente(x,y));}catch(Exceptione){JOptionPane.showMessageDialog(null,"Vc errou");}}}
serve pra jogar alguma exceção se for capturada na execução do seu método.
maquiavelbona
Throws você deixa claro que você passará para frente uma Exception. Num bloco try/catch/finaly você trata o erro naquele momento, usando o throws você deixa para a instância acima tratá-lo.
Por exemplo:
publicclassTesteThrows{publicstaticvoidmain(String[]args){System.out.println("Irei verificar o erro que ocorre em divisão por zero");geraErro(1,0);System.out.println("Terminou o programa");}privatestaticintgeraErro(inti,intj){returni/j;}}
Ele acusará a Exception no return de geraErro. Vamos agora tratar o erro:
publicclassTesteThrows2{publicstaticvoidmain(String[]args){System.out.println("Irei verificar o erro que ocorre em divisão por zero");try{geraErro(1,0);}catch(ArithmeticExceptionex){System.out.println("Tratei o erro no main");}System.out.println("Terminou o programa");}privatestaticintgeraErro(inti,intj){intx;try{x=i/j;}catch(ArithmeticExceptione){System.out.println("Tratei o erro em geraErro");returnx;}returnx;}}
E verificarás que só aparecerá o tratamento em geraErro. Mas quando forças a instância acima:
publicclassTesteThrows3{publicstaticvoidmain(String[]args){System.out.println("Irei verificar o erro que ocorre em divisão por zero");try{geraErro(1,0);}catch(ArithmeticExceptionex){System.out.println("Tratei o erro no main");}System.out.println("Terminou o programa");}privatestaticintgeraErro(inti,intj)throwsArithmeticException{intx;x=i/j;returnx;}}
Você joga o tratamento de erro diretamente para o main().
Até!
maquiavelbona
Você também pode tratar o erro e mesmo assim encaminhar a mesma Exception ou outra. Vide exemplo:
publicclassTesteThrows4{publicstaticvoidmain(String[]args){System.out.println("Irei verificar o erro que ocorre em divisão por zero");try{geraErro(1,0);}catch(ArithmeticExceptionex){System.out.println("Tratei o erro do tipo ArithmeticException no main");}catch(IllegalArgumentExceptione){System.out.println("Mas eu também posso receber o tipo IllegalArgumentException");}System.out.println("Terminou o programa");}privatestaticintgeraErro(inti,intj)throwsIllegalArgumentException{intx;try{x=i/j;}catch(ArithmeticExceptione){System.out.println("Tratei o erro no geraErro mas vou passar para frente com outro tipo");thrownewIllegalArgumentException("Erro em argumento inválido, gera uma divisão por zero",e);}returnx;}}
Throws e bloco try/catch/finally tem que ser usados com critério, para não fazer com que os tratamentos de erro não sejam executados em momentos inoportunos.
Até!
edymrex
Obrigado
peerless
Tópico de JAVA BÁSICO
em tempo… eu não indicaria o uso de throws … pois de qualquer forma, uma hora a exceção terá de ser tratada. Então deixe os problemas já resolvidos no código reservado, utilizando o try/catch.
É apenas, a minha opinião.
a[]s
maquiavelbona
Tem vezes que a delegação de tratamento de erro não é propriedade do objeto mais próximo. Pode ser que queiras retornar a exceção para outro objeto tratar( ex.: um seletor de banco de dados, você pode tratar dos erros ali mesmo, mas pode ser que queiras receber a exceção que tal banco não funcionou e que isso seja tratado de uma forma diferente).
E tem vezes que mesmo que não ocorra uma exceção, você quer que ocorra(por exemplo em controle de acesso) para que isso seja tratado de uma maneira mais efetiva.
Até!
T
thingol
peerless:
Tópico de JAVA BÁSICO
em tempo… eu não indicaria o uso de throws … pois de qualquer forma, uma hora a exceção terá de ser tratada. Então deixe os problemas já resolvidos no código reservado, utilizando o try/catch.
É apenas, a minha opinião.
a[]s
Eu acho que é justamente o contrário - usar throws a maior parte do tempo, e resolver os problemas só quando necessário ou quando for pertinente.
Tentar resolver problemas em nível muito baixo pode acabar “escondendo” os problemas.
edymrex
Quando eu uso throws abaixo do método exemplo:
public static void imprime()
throws Exception
É pra chamar uma catch que está em outro método ? exemplo essa classe de teste que eu criei:
packagecom.testes;importjavax.swing.JOptionPane;publicclassTestes{publicstaticvoidmain(Stringargs[]){intx,y;try{x=Integer.parseInt(JOptionPane.showInputDialog("Dígite o numerador "));y=Integer.parseInt(JOptionPane.showInputDialog("Dígite o denominador "));calcula(x,y);}catch(Exceptione){System.err.println("Tratando exceção do main");}}publicstaticvoidcalcula(intx,inty)throwsException{try{System.out.println("Dívisão "+x/y);thrownewException();}catch(ArithmeticExceptione){System.out.println("Dívisão por zero");}catch(NumberFormatExceptione){System.out.println("Vc digitou uma string ");}finally{System.out.println("Percorre todo o método e termina aki ");}}}
na parte throw new Exception(); ele lança uma nova exceção que está no corpo do main mais para que isto ocorrece tive que colocar no método calcula a expressão throws Exception com o nome da exceção que estou lançando, mas throws tb trata exceções do método mas não vejo sentido se vc chama o método dentro de um try catch é isto mesmo…?
maquiavelbona
Em geral. você lança uma exceção num catch, não num try, pois a intenção do try é percorrê-lo de uma maneira completa, e o do catch tratar a exceção, aí sim enviando uma exceção diferente.
Modifiquei o seu código para que pudesse ver melhor como acontece. Aproveitei e criei uma Exception própria, que poderias usar para identificar tipos que sabes que pode acontecer, sem precisar recorrer as Exceptions padrão.
importjavax.swing.JOptionPane;publicclassTestes{publicstaticvoidmain(Stringargs[]){Stringx,y;try{x=JOptionPane.showInputDialog("Dígite o numerador ");y=JOptionPane.showInputDialog("Dígite o denominador ");calcula(x,y);}catch(Exceptione){System.out.println("Tratando exceção do main");e.printStackTrace();}}publicstaticvoidcalcula(Stringx,Stringy)throwsCalculoTesteException{try{System.out.println("Dívisão "+Integer.parseInt(x)/Integer.parseInt(y));}catch(ArithmeticExceptione){System.out.println("Dívisão por zero");thrownewCalculoTesteException("Erro por causa da divisão por zero",e);}catch(NumberFormatExceptione){System.out.println("Vc digitou uma string ");thrownewCalculoTesteException("Erro por causa de informação errada",e);}finally{System.out.println("Percorre todo o método e termina aki ");}}}classCalculoTesteExceptionextendsException{publicCalculoTesteException(Stringstring,Exceptione){super(string,e);System.out.println("Tipo da exceção: "+e.getClass());}publicCalculoTesteException(){super();}publicCalculoTesteException(Stringstring){super(string);}}