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.!!?
[code]import java.io.IOException;
import javax.swing.JOptionPane;
public class TimeToTryOrCatch_GUI {
int a, b;
protected void setValor1(int a){this.a = a;}
protected void setValor2(int b){this.b = b;}
protected int divideValor(){
int c;
try {
c = this.a / this.b;
return c;
} catch (Exception e){
System.out.println("Ocorreu um erro inesperado...");
return 0;
}
}
public static void main(String args[]) throws IOException{
String v1, v2;
v1 = JOptionPane.showInputDialog(null,"Insira o primeiro valor", "Valor1");
v2 = JOptionPane.showInputDialog(null,"Insira o segundo valor", "Valor2");
TimeToTryOrCatch_GUI teste = new TimeToTryOrCatch_GUI();
System.out.println(teste.divideValor());
//JOptionPane.showMessageDialog(null, "O valor total é " + Integer.toString(teste.divideValor()));
}
public TimeToTryOrCatch_GUI(){
}
}[/code]
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.?
Vc verifica se os valores são válidos. Se não forem, vc dispara uma excessão para o usuário.
Agora eu tenho o código corrigido:
[code]import java.io.IOException;
import javax.swing.JOptionPane;
public class TimeToTryOrCatch_GUI {
int a, b;
protected void setValor1(int a){this.a = a;}
protected void setValor2(int b){this.b = b;}
protected int divideValor(){
int c ;
c = this.a / this.b;
return c;
}
public static void main(String args[]) throws IOException{
String v1, 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_GUI teste = new TimeToTryOrCatch_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 (ArithmeticException e) {
System.out.println("ERRO - Você está tentando dividir um número por 0 (zero).");
} catch (NumberFormatException nfe) {
System.out.println("ERRO - Formato desconhecido, verifique o numero informado.");
}
}
public TimeToTryOrCatch_GUI(){
}
}[/code]
Mas vejam que se eu inserir no showInputMessage o valor 555555 por exemplo ele entrará na exception
Exception in thread "main" java.lang.NumberFormatException: For input string: "321321321231231"
PQ? Se eu inserir o valor 55555 ele passa, mas se for 5555555555 ele exibe essa exceção.
é 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.
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)?
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);
[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?