Amigos, estou fazendo alguns testes sobre Exceções e tenho um código bem simples abaixo.
Vejam que eu tratei o método divideValor(), mas independente do valor que eu inserir nos atributos a e b ele dá erro (exception).!
Pq?
Qual, como e onde é a melhor maneira de tratar essa exceção.!!?
importjava.io.IOException;importjavax.swing.JOptionPane;publicclassTimeToTryOrCatch_GUI{inta,b;protectedvoidsetValor1(inta){this.a=a;}protectedvoidsetValor2(intb){this.b=b;}protectedintdivideValor(){intc;try{c=this.a/this.b;returnc;}catch(Exceptione){System.out.println("Ocorreu um erro inesperado...");return0;}}publicstaticvoidmain(Stringargs[])throwsIOException{Stringv1,v2;v1=JOptionPane.showInputDialog(null,"Insira o primeiro valor","Valor1");v2=JOptionPane.showInputDialog(null,"Insira o segundo valor","Valor2");TimeToTryOrCatch_GUIteste=newTimeToTryOrCatch_GUI();System.out.println(teste.divideValor());//JOptionPane.showMessageDialog(null, "O valor total é " + Integer.toString(teste.divideValor()));}publicTimeToTryOrCatch_GUI(){}}
Eu não acredito que eu fiz a façanha de não inicializar meus atributos a e b.
Desculpem, mas ainda há dúvida.
Qual, como e onde seria a melhor maneira de tratar um erro que possa ocorrer quando o usuário inserir um valor.?
R
rodrigosntPJ
Vc verifica se os valores são válidos. Se não forem, vc dispara uma excessão para o usuário.
T
terra_jrPJ
Agora eu tenho o código corrigido:
importjava.io.IOException;importjavax.swing.JOptionPane;publicclassTimeToTryOrCatch_GUI{inta,b;protectedvoidsetValor1(inta){this.a=a;}protectedvoidsetValor2(intb){this.b=b;}protectedintdivideValor(){intc;c=this.a/this.b;returnc;}publicstaticvoidmain(Stringargs[])throwsIOException{Stringv1,v2;v1=JOptionPane.showInputDialog(null,"Insira o primeiro valor","Teste de velocidade para tratar exceções");v2=JOptionPane.showInputDialog(null,"Insira o segundo valor","Teste de velocidade para tratar exceções");TimeToTryOrCatch_GUIteste=newTimeToTryOrCatch_GUI();teste.setValor1(Integer.parseInt(v1));teste.setValor2(Integer.parseInt(v2));try{System.out.println(teste.divideValor());//JOptionPane.showMessageDialog(null, "O valor total é " + Integer.toString(teste.divideValor()));}catch(ArithmeticExceptione){System.out.println("ERRO - Você está tentando dividir um número por 0 (zero).");}catch(NumberFormatExceptionnfe){System.out.println("ERRO - Formato desconhecido, verifique o numero informado.");}}publicTimeToTryOrCatch_GUI(){}}
Mas vejam que se eu inserir no showInputMessage o valor 555555 por exemplo ele entrará na exception
PQ? Se eu inserir o valor 55555 ele passa, mas se for [telefone removido] ele exibe essa exceção.
B
bbvianaPJ
é pq 5.555.555.555 ultrapassa o limite do integer, q vai -2.147.483.648 a 2.147.483. 647.
Experimente usar Long.toString q deve funcionar.
T
terra_jrPJ
Entendido, tem razão.
Acho que estou muito destraído mesmo, todas as minhas dúvidas são coisas ridículas.!!
Bom, seria aconselhável eu usar um IF para verificar se o valor retornado é maior que o suportado para Int?
Estou perguntando isso, pq o meu catch catch (NumberFormatException nfe) {
System.out.println("ERRO - Formato desconhecido, verifique o numero informado.");
não tratou esse erro…
Não é assim que eu trato esse erro.?
Se o cara inserir uma string ao invés de int, não retornará essa exception (NumberFormatException)?
S
SchuenemannPJ
Por que não muda a mensagem de erro?
System.out.println("ERRO - O formato é inválido ou o número é muito grande./nApenas números são aceitos e o valor máximo é "+Integer.MAX_VALUE);
T
terra_jrPJ
[quote=“Schuenemann”]Por que não muda a mensagem de erro?
System.out.println("ERRO - O formato é inválido ou o número é muito grande./nApenas números são aceitos e o valor máximo é "+Integer.MAX_VALUE);
Valeu amigo pela frase, é que na verdade o código que eu postei é apenas um teste de melhores práticas para se programar, então o texto está escrito de qualquer jeito…!!
Mas mesmo assim, porque ele não tratou o erro?
Eu pedi para tratar no try/catch, pq ele não tratou?