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");
}
}
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.
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 ) , 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
É 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 ) , 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: