Como e onde tratar essa exceção?

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

6 Respostas

thiago.correa

O teu programa está com problema de lógica, você lê dois valores mas na verdade não são esses dois valores que você está dividindo, pois você não está usando o seu método setValor1 e setValor2 para armazenar os valores que você leu!

T

info_god:
Cara vc ta tentando dividir 0 / 0…

Vc não inicializou suas variaveis.

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

thiago.correa

Depende, o teu método pode lançar a exceção, ao invés de você tratá-la nele próprio, e na chamada dele (no método main) você dá um try/catch, no catch você dá um alerta dizendo o que ocorreu.

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.

I

Cara vc ta tentando dividir 0 / 0…

Vc não inicializou suas variaveis.

I

Esse tipo de excessão é uma ArithmeticException division by 0 (/0).

Agora aonde tratar sua excessão vc pode escolher, aonde vc chama o metodo exemplo:

try{
       teste.divideValor();
     } catch (ArithmeticException e) {
         e.printStackTrace(); //pra ver o erro
      }

Ou dentro do seu metodo quando tentar dividir…

Criado 9 de agosto de 2006
Ultima resposta 9 de ago. de 2006
Respostas 6
Participantes 3