Dúvida try-catch [RESOLVIDO]

9 respostas
T

Boa tarde!

Estamos aprendendo tratamento de exceções (Try-catch, throws) e o professor passou um exercício de fixação com o seguinte enunciado: Altere o programa a seguir para avisar o usuário que uma das variáveis foi digitada incorretamente, informando qual foi.

package exerciciosjava;

import javax.swing.JOptionPane;

public class exercicio2_excecao {

    public static void main(String[] args) {
        n1 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite um número inteiro: "));
        n2 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite outro número inteiro: "));
        JOptionPane.showMessageDialog(null, "A soma dos dois números é: " + (n1 + n2));
        
    
    }
}

Eu fiz as seguintes alterações, mas acredito não estar atendendo corretamente o solicitado e entendo também que há uma forma mais enxuta de fazer isso, usando throws. Já pesquisei e não encontro uma lógica adequada para realizar a tarefa:

package exerciciosjava;

import javax.swing.JOptionPane;

public class exercicio2_excecao {

    public static void main(String[] args) {
       
        int n1 = 0;
        int n2 = 0;

        try {
            n1 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite um número inteiro: "));

        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "O primeiro número foi digitado incorretamente!");
            
        }
        try {
            n2 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite outro número inteiro: "));

        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "O segundo número foi digitado incorretamente!");

        }
        if (n1 > 0 && n2 > 0) {
            JOptionPane.showMessageDialog(null, "A soma dos dois números é: " + (n1 + n2));
        } else {
            JOptionPane.showMessageDialog(null, "Não é possível realizar a soma");
        }
    }
}

Agradeço a atenção.

Tiago Gregório.

9 Respostas

E

O seu código está certo, mas o jeito de você checar se pode fazer a conta está um pouco errado (afinal de contas, o número -10 é um número inteiro, não?)

Uma das formas, que é mais curta mas mais difícil de entender (você vai ver por quê) é:

package exerciciosjava;  
      
import javax.swing.JOptionPane;  
      
public class exercicio2_excecao {  
      
    public static void main(String[] args) {
        int n1, n2;
        try {
            n1 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite um número inteiro: "));
            try {
                n2 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite outro número inteiro: "));  
                JOptionPane.showMessageDialog(null, "A soma dos dois números é: " + (n1 + n2));  
            } catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(null, "O segundo número foi digitado incorretamente!"); 
            }
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "O primeiro número foi digitado incorretamente!"); 
        }
    }  
 
}

Outra, que é mais clara, e que usaria porque é mais fácil de entender, é:

public static void main(String[] args) {
        int n1 = 0, n2 = 0;
        boolean erro = false;
        try {
            n1 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite um número inteiro: "));
        } catch (NumberFormatException ex) {
            erro = true;
            JOptionPane.showMessageDialog(null, "O primeiro número foi digitado incorretamente!"); 
        }
        try {
            n2 = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite outro número inteiro: "));  
        } catch (NumberFormatException ex) {
            erro = true;
            JOptionPane.showMessageDialog(null, "O segundo número foi digitado incorretamente!"); 
        }
        if ( ! erro) {
            JOptionPane.showMessageDialog(null, "A soma dos dois números é: " + (n1 + n2));
        } else {
            JOptionPane.showMessageDialog(null, "Não é possível realizar a soma");
        }
    }

Mas o mais usual é ficar repetindo a entrada até receber um número correto. Como isso não foi pedido, não vou mostrar abaixo, mas basicamente você usaria um do/while.

T

Realmente a verificação estava incorreta :frowning: .
Sua solução está bem melhor.

Muito obrigado!

linngallo

Eu faria assim (Usando o try/catch apenas uma vez, e usando o throw):

public static void main(String[] args) {

		int n1 = 0;
		int n2 = 0;
		boolean errado = true;

		while (errado) {
			try {
				n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
						"Digite um número inteiro: "));
				n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
						"Digite outro número inteiro: "));

				if (n1 < 0 || n2 < 0) {
					throw new NumberFormatException(
							"Um dos números digitados é menor que zero! Tente novamente...");
				}

				errado = false;

			} catch (NumberFormatException ex) {
				JOptionPane
						.showMessageDialog(null,
								"Um dos números foi digitado incorretamente! Tente novamente...");
			}
		}
		JOptionPane.showMessageDialog(null, "A soma dos dois números é: "
				+ (n1 + n2));
	}
E

Linngalo, a resolução do exercício pede explicitamente que se indique se o primeiro ou o segundo número é que teve problema de conversão.

linngallo

Tem razão, amigo. Acho que isso resolve:

public static void main(String[] args) {
		int n1 = 0;
		int n2 = 0;
		boolean errado = true;
		String n = "";

		while (errado) {

			try {
				n = "primeiro";
				n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
						"Digite um número inteiro: "));
				n = "segundo";
				n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
						"Digite outro número inteiro: "));

				if (n1 < 0 && n2 < 0) {
					throw new Exception(
							"Os nºs"
									+ n1
									+ " e "
									+ n2
									+ "digitados são menor que zero! Tente novamente...");
				} else if (n1 < 0 && n2 >= 0) {
					throw new Exception(
							"O nº ["
									+ n1
									+ "] digitado é menor que zero ou não corresponde a um número! Tente novamente...");
				} else if (n1 >= 0 && n2 < 0) {
					throw new Exception(
							"O nº ["
									+ n2
									+ "] digitado é menor que zero ou não corresponde a um número! Tente novamente...");
				}
				errado = false;

			} catch (Exception ex) {
				if (ex instanceof NumberFormatException) {

					JOptionPane.showMessageDialog(null, "O " + n
							+ " valor não é um número inteiro!");

				} else {
					JOptionPane.showMessageDialog(null, ex.getMessage());
				}
			}
		}
		JOptionPane.showMessageDialog(null, "A soma dos dois números é: "
				+ (n1 + n2));
	}
E

Lingallo, outra coisa é que um número negativo ou zero também é um número inteiro (não foi solicitado no problema que o número fosse estritamente positivo :slight_smile: ) , portanto se você entrar com números negativos isso não é um erro - ou seja, não dá para validar comparando com zero.

A validação deve ser feita de outra forma.

Por exemplo, ligando um flag se entrar dentro do catch (embora eu seja contrário ao uso excessivo de flags).

E

Se quiser economizar try/catchs, você pode criar um método do tipo “isNumeric” ou coisa parecida, que checa se uma string representa um valor numérico. Algo como

public static boolean isNumeric (String str) {
    try { Integer.parseInt (str); } catch (NumberFormatException ex) { return false; }
    return true;
}

É claro que se eu usar um método desses, vou efetuar o parse de cada string 2 vezes - uma para checar se é numérico e a outra para fazer a conversão propriamente dita.

linngallo

entanglement:
Lingallo, outra coisa é que um número negativo ou zero também é um número inteiro (não foi solicitado no problema que o número fosse estritamente positivo :slight_smile: ) , portanto se você entrar com números negativos isso não é um erro - ou seja, não dá para validar comparando com zero.

A validação deve ser feita de outra forma.

Por exemplo, ligando um flag se entrar dentro do catch (embora eu seja contrário ao uso excessivo de flags).

Ah, sim, concordo. Eu só mantive asssim, porque no modelo inicial que o cara mostrou, estava checando se era maior que zero, então, imaginei que o zero não pudesse também… :oops:

E

:oops: isso se chama “ir na onda” :slight_smile: - você foi na onda do Tiago e quase se afogou no tsunami :slight_smile:

Criado 19 de junho de 2012
Ultima resposta 19 de jun. de 2012
Respostas 9
Participantes 3