Como e onde tratar essa exceção?

7 respostas
T

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.!!?

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(){
    }
}

7 Respostas

T

Eu não acredito que eu fiz a façanha de não inicializar meus atributos a e b. :slight_smile:
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

Vc verifica se os valores são válidos. Se não forem, vc dispara uma excessão para o usuário.

T

Agora eu tenho o código corrigido:

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(){
    }
}
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 [telefone removido] ele exibe essa exceção.

B

é 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

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

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

[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?

Criado 9 de agosto de 2006
Ultima resposta 10 de ago. de 2006
Respostas 7
Participantes 4