Dúvida try-catch [RESOLVIDO]

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.

[code]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));
    

}

}[/code]

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:

[code]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");
    }
}

}[/code]

Agradeço a atenção.

Tiago Gregório.

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.

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

Muito obrigado!

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));
	}

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.

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));
	}

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

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.

[quote=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).
[/quote]

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:

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