Duvida com NumberFormatException e If-Else

7 respostas
joni.mendes

Gente, eu fiz esse código pra testar meus estudos iniciais
e não sei como que eu faço uma exceção pra quando o usuario digitar a idade e ao invez de numeros, digitar letras ou deixar em branco ele tratar o erro.

E outra coisa, no final do código, eu fiz um if para que quando o usuario apertasse YES ele entrasse no If e caso contrario entrasse no ELSE.
Mas não esta funcionando, ele está pulando o If.

Me ajudem Por favor!

Agradeço desde ja! :D

import javax.swing.JOptionPane;
public class firstprogram {
		public static void main(String args[]){
		
		String nome;
		int idade; 
		int passagem;
		
		nome= (JOptionPane.showInputDialog(null,"Digite seu nome", "NOME", JOptionPane.PLAIN_MESSAGE));
		idade=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE));
		
		if(idade<18){
			JOptionPane.showMessageDialog(null, "Sinto muito, você não tem idade para comprar uma passagem", "Ops!", JOptionPane.INFORMATION_MESSAGE);
		}else
		{
			
		passagem=Integer.parseInt(JOptionPane.showInputDialog(null,"1-Europa ; 2-Am. do Norte ; 3-Africa ; 4-Asia ; 5-Oceania", "ESCOLHA O CONTINENTE", JOptionPane.QUESTION_MESSAGE));
		
		switch(passagem){
		
		case 1: JOptionPane.showConfirmDialog(null, "Viagem para Europa custa R$5,000", "CUSTOS", JOptionPane.YES_NO_OPTION);
		break;
		
		case 2: JOptionPane.showConfirmDialog(null, "Viagem para Am. do Norte custa R$2,000", "CUSTOS", JOptionPane.YES_NO_OPTION);
		break;
		
		case 3: JOptionPane.showConfirmDialog(null, "Viagem para Africa custa R$1,500", "CUSTOS", JOptionPane.YES_NO_OPTION);
		break;
		
		case 4: JOptionPane.showConfirmDialog(null, "Viagem para Asia custa R$3,000", "CUSTOS", JOptionPane.YES_NO_OPTION);
		break;
		
		case 5: JOptionPane.showConfirmDialog(null, "Viagem para Oceania custa R$2,500", "CUSTOS", JOptionPane.YES_NO_OPTION);
		break;
		
		default: JOptionPane.showConfirmDialog(null, "Escolha uma opção válida", "ESCOLHA INVÁLIDA", JOptionPane.CANCEL_OPTION);
		break;
		}
		
		if(passagem == JOptionPane.YES_OPTION){
			JOptionPane.showMessageDialog(null, "Origado "+nome+" a cobrança de sua passagem, será debitada em conta nos proximos 5 dia", "COMPRA FINALIZADA", JOptionPane.INFORMATION_MESSAGE);
		}
		else{
			JOptionPane.showMessageDialog(null, "Obrigado "+nome+", agradeçemos sua visita", "COMPRA NÃO FINALIZADA", JOptionPane.INFORMATION_MESSAGE);
		}

		}
		}
	
	
}

7 Respostas

LucasAdri07

Dê uma olhada na apostila da caelum FJ-11 , no Capitulo 11, Pág 133, sobre Controlando os erros com Exceções, usando Try Catch.

F

No seu último if, eu acho q o JOptionPane não retorna um inteiro, talvez seja um boolean.

E qdo a exceção procura sobre try-catch.

thiago.sydow

Faça as recomendações acima. Para resolver o seu problema momentaneamente...

int idade;
para
int idade = 0;
idade=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE));
para
while( idade == 0 ){
         try{
            idade=Integer.parseInt(JOptionPane.showInputDialog(null,"Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE));  
         }catch( NumberFormatException e ){
            JOptionPane.showMessageDialog(null, "Digite um numero valido !", "Ops!", JOptionPane.INFORMATION_MESSAGE);
         }
      }
LucasAdri07

Hmm e sobre o JOptionPane, eu li algo que seria mais ou menos assim:

int x =  JOptionPane.showConfirmDialog(
    null,
    "Gostaria de confirmar a compra?",
    JOptionPane.YES_NO_OPTION);


if (x == JOptionPane.YES_OPTION) {            //clicou no sim
 JOptionPane.showMessageDialog(null,
           "Compra efetuada");
} else if (x == JOptionPane.NO_OPTION) {      //clicou no nao
 JOptionPane.showMessageDialog(null,
           "Compra não efetuada, Obrigado pela visita");
}

Se eu estiver errado, me corrijão por favor ...

E

Compare com seu programa e veja as coisas interessantes. Dei uma ajeitada no seu programa.

package guj;

import javax.swing.JOptionPane;

public class FirstProgram {

    private static boolean numerico(String valor) {
        try {
            Integer.parseInt(valor);
            return true;
        } catch (NumberFormatException ex) {
            return false;
        }
    }

    public static void main(String args[]) {

        String nome;
        int idade;
        int passagem;
        int opcao;
        boolean ok = false;

        while (!ok) {
            nome = (JOptionPane.showInputDialog(null, "Digite seu nome", "NOME", JOptionPane.PLAIN_MESSAGE));

            String strIdade = JOptionPane.showInputDialog(null, "Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE);
            if (!numerico(strIdade)) {
                JOptionPane.showMessageDialog(null, "Solicito obsequiosamente que seja digitado um número.", "Cáspite!",
                    JOptionPane.ERROR_MESSAGE);
                continue;
            }
            idade = Integer.parseInt(strIdade);
            if (idade < 18) {
                JOptionPane.showMessageDialog(null, "Sinto muito, você não tem idade para comprar uma passagem", "Ops!",
                    JOptionPane.INFORMATION_MESSAGE);
            } else {
                passagem = Integer.parseInt(JOptionPane.showInputDialog(null,
                    "1-Europa ; 2-Am. do Norte ; 3-Africa ; 4-Asia ; 5-Oceania", "ESCOLHA O CONTINENTE",
                    JOptionPane.QUESTION_MESSAGE));

                switch (passagem) {

                case 1:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para Europa custa R$5,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 2:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a América do Norte custa R$2,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 3:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a África custa R$1,500", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 4:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a Ásia custa R$3,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 5:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a Oceania custa R$2,500", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                default:
                    opcao = JOptionPane.showConfirmDialog(null, "Escolha uma opção válida", "ESCOLHA INVÁLIDA",
                        JOptionPane.CANCEL_OPTION);
                    break;
                }

                if (opcao == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(null, "Obrigado " + nome
                            + ".\n A cobrança de sua passagem será debitada em conta nos próximos 5 dias", "COMPRA FINALIZADA",
                        JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(null, "Obrigado " + nome + ", agradecemos sua visita", "COMPRA NÃO FINALIZADA",
                        JOptionPane.INFORMATION_MESSAGE);
                }
                break;
            }
        }
    }
}
joni.mendes

:thumbup: Poo, valeeeeeu entanglement, eu entendi a sacada.
Não sabia que precisava criar uma variavel pra receber o resultado do YES_NO_OPTION pra depois fazer a verificação, pensei que
ele ja dava como resultado 1-YES e 0-NO ou se eu comparasse daquela forma que havia feito daria certo, não estava entendendo pq pulava o If.
Valeu!

Agora, sobre a exceção, você pode me explicar esse trecho? o que você está fazendo aqui? (Desculpe a ignorancia, sou leigo d+)

private static boolean numerico(String valor) { try { Integer.parseInt(valor); return true; } catch (NumberFormatException ex) { return false; } }

E por que você cria uma variavel do tipo boolean para fazer o while?

Aquele str que você coloca antes da variavel Idade serve pra que?

e a ultima pergunta, prometo :stuck_out_tongue: !!!

aquele continue; faz oq ?

Abraços e muitissimo obrigado!!! :thumbup:

lina
entanglement:
Compare com seu programa e veja as coisas interessantes. Dei uma ajeitada no seu programa.
package guj;

import javax.swing.JOptionPane;

public class FirstProgram {

    private static boolean numerico(String valor) {
        try {
            Integer.parseInt(valor);
            return true;
        } catch (NumberFormatException ex) {
            return false;
        }
    }

    public static void main(String args[]) {

        String nome;
        int idade;
        int passagem;
        int opcao;
        boolean ok = false;

        while (!ok) {
            nome = (JOptionPane.showInputDialog(null, "Digite seu nome", "NOME", JOptionPane.PLAIN_MESSAGE));

            String strIdade = JOptionPane.showInputDialog(null, "Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE);
            if (!numerico(strIdade)) {
                JOptionPane.showMessageDialog(null, "Solicito obsequiosamente que seja digitado um número.", "Cáspite!",
                    JOptionPane.ERROR_MESSAGE);
                continue;
            }
            idade = Integer.parseInt(strIdade);
            if (idade < 18) {
                JOptionPane.showMessageDialog(null, "Sinto muito, você não tem idade para comprar uma passagem", "Ops!",
                    JOptionPane.INFORMATION_MESSAGE);
            } else {
                passagem = Integer.parseInt(JOptionPane.showInputDialog(null,
                    "1-Europa ; 2-Am. do Norte ; 3-Africa ; 4-Asia ; 5-Oceania", "ESCOLHA O CONTINENTE",
                    JOptionPane.QUESTION_MESSAGE));

                switch (passagem) {

                case 1:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para Europa custa R$5,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 2:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a América do Norte custa R$2,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 3:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a África custa R$1,500", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 4:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a Ásia custa R$3,000", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                case 5:
                    opcao = JOptionPane.showConfirmDialog(null, "Viagem para a Oceania custa R$2,500", "CUSTOS",
                        JOptionPane.YES_NO_OPTION);
                    break;

                default:
                    opcao = JOptionPane.showConfirmDialog(null, "Escolha uma opção válida", "ESCOLHA INVÁLIDA",
                        JOptionPane.CANCEL_OPTION);
                    break;
                }

                if (opcao == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(null, "Obrigado " + nome
                            + ".\n A cobrança de sua passagem será debitada em conta nos próximos 5 dias", "COMPRA FINALIZADA",
                        JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(null, "Obrigado " + nome + ", agradecemos sua visita", "COMPRA NÃO FINALIZADA",
                        JOptionPane.INFORMATION_MESSAGE);
                }
                break;
            }
        }
    }
}

Oi,

Se você analisar por boas praticas de programação, o correto seria apenas tratar a exceção NumberFormatException.

Ficaria.:

try {
     int idade = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite sua idade", "IDADE", JOptionPane.PLAIN_MESSAGE));
}
catch (NumberFormatException ex) {
   JOptionPane.showMessageDialog(null, "Solicito obsequiosamente que seja digitado um número.", "Cáspite!",
                    JOptionPane.ERROR_MESSAGE);
                continue;
}

Ou então criar um método único para todas as variaveis do tipo int, levantando a exceção:

private static void isNumber(String valor) throw NumberFormatException {
            Integer.parseInt(valor);
}

Tchauzin!

Criado 22 de junho de 2010
Ultima resposta 22 de jun. de 2010
Respostas 7
Participantes 6