Usando try/catch para não aceitar letra com if()

9 respostas
S

Boa tarde, logo resolvi um problema estou com dúvida em outra coisa, pesquisei bastante e a maioria fala de JPaneTextField e outras coisas de interface grafica, porém não estou mexendo com interface gráfica ainda e não entendi os posts sobre a minha dúvida.

Eu preciso que, se for digitado qualquer coisa que não seja um número aconteça apareça uma mensagem informando que só aceita números.

Meu código esta assim

public static void main(String[] args)
    {
        int x = 0;
        //Menu Principal
        System.out.println("Selecione o tipo de colaborador para calculo de pagamento:");
        System.out.println("Digite 1 para Celetista");
        System.out.println("Digite 2 para Pessoa Juridica");
        System.out.println("Digite 0 para Sair");
       
            do {
               try{ 
                x = Keyboard.readInt();
               }catch(InputMismatchException erro1) 
               {System.err.println("Não é permitido inserir letras, informe uma opção válida!"+erro1);}
               
                if(x == 1){
                   ação 1...
                }

                else if(x == 2){
                    ação 2...
                }

                else if(x == 0){
                    System.exit(0);
                }
                
                else if(x != 0 && x != 1 && x != 2){ 
                    
                    System.out.println("Escolha uma opção válida");
                    System.out.println("Selecione o tipo de colaborador para calculo de pagamento:");
                    System.out.println("Digite 1 para Celetista");
                    System.out.println("Digite 2 para Pessoa Juridica");
                    System.out.println("Digite 0 para Sair");
                }
            
    }while(true);
    }            
}

Os números aceitos são apenas 1, 2 e 0, isso ja esta funcionando. Eu adicionei aquele ImputMismatchException, pensando teoricamente que ele iria pegar letras e não iria printar na tela a mensagem que coloquei... Porém quando uma letra é digitada, o programa para, sem mensagem nenhuma de erro ou exceção.

Qual seria o caminho para meu if desse menu que criei só aceitar números?

9 Respostas

carloshsamaral

sanozukez amigo tenta usar fazer um método que recebe esse valor e dentro dele fizesse a chamada caso ocorresse erro?

try { .... } catch (Exception e) { System.out.println("Deu erro "+e.getMessage()); nomeDoMetodo(); }

Aí toda vez que ele cair na exceção vai dar um erro ou fazer um validador do dado que está entrnado sei que tenho um no HD aqui deixa eu achar q posto

EDIT: To com o HD mas o cabo pra conectar no notebook ficou em casa e ninguém aqui tem esse cabo!
EDIT2 : Vê se isso te ajuda :wink: Link do forúm mas por favor não reviva ele

S

Carlos, obrigado pela resposta.
Então, na verdade eu tentei utilizar algo parecido eu acho.
Eu achei esse método e coloquei na classe pai, da qual a classe que vai ser instanciada se eu escolher a opção 1 herda ou seja, essa classe que vai instanciar se eu escolher 1 herda de uma outra, e é aí que coloquei o metodo. Mas não sei como utilizar. Estou quebrando a cabeça aqui mas não consegui ainda.

Veja o método que achei para validar

public static boolean isNumeric (String s) { try { Long.parseLong (s); return true; } catch (NumberFormatException ex) { System.out.println("Digite uma opção válida!"); return false; } }

nem lembro onde achei pois ja abri mais de 200 páginas aqui nas ultima horas.

Mas enfim, não sei como utilizar ele na hora de ler do meu keyboard…

carloshsamaral

Vou tentar fazer algo aqui pra te ajudar e já posto como da pra fazer... Não sou dos mais hard users de java mas da pra fazer algo ahha

Edit:
public class HelloMain {
	public static void main(String[] args) {
		NewClass n = new NewClass();
		Scanner in = new Scanner(System.in);
		String valor;
		System.out.print("Digite algo algo: ");
		valor = in.next();
		
		if(n.campoNumerico(valor)){
			System.out.println("Numerico");
		}else{
			System.out.println("Não é numerico");
		}
	}
}
public class NewClass {
	public boolean campoNumerico(String campo){		
			return campo.matches("[0-9]{"+campo.length()+"}");
	}
}

No meu caso eu usei o if e no seu use o while(valor)

S

Não deu certo. Ele até não aceita mais letra, porém eu fiz com o while como você disse, só que ao escolher uma opção válida ele entra em loop infinito printando tudo sem parar.

carloshsamaral

Depois q ele fizer a ação joga um false pro campo que ele sai

O while é enquanto ...

enquanto(verdadeiro){
vai fazer tudo isso
...
e quando terminar ele volta
quando ele terminar de fazer a ação você tem que fazer a condição ser verdadeira pra ele não entrar
}

E segue o código que eu tinha pra validar se é número ou não

public static int leituraInteiro(String tela){
		Scanner scan = new Scanner(System.in);
		System.out.print(tela);
		String numero = scan.nextLine();
		int num = 0;
		boolean conversao = true;
		while(conversao){
			try{
				num = Integer.parseInt(numero);
				conversao = false;
			}catch(Exception e){
				System.out.println("Só é válidos numeros inteiros!!");
				System.out.println(tela);
				numero = scan.nextLine();
			}
			
		}
	
		return num;
	}

//ainda tenho esses dois

	public static boolean verificaDigitoInteiroString( String s ) {   
		  
	    char[] c = s.toCharArray();   
	    boolean d = true;   
	    for ( int i = 0; i < c.length; i++ ){   
	        if ( !Character.isDigit( c[ i ] ) ) {   
	            d = false;   
	            break;   
	        }   
	    }   
	  
	    return d;   
	  
	}  

	public static String somenteLetras(String str){
		while(verificaDigitoInteiroString(str)){
			str = Util.leituraString("\nInforme novamente o campo(Somente letras): ");
		}
		return str;
	}
	
	public static String somenteNumeros(String str){
		while(!verificaDigitoInteiroString(str)){
			str = Util.leituraString("\nInforme novamente o campo(Somente numeros): ");
		}
		return str;
	}
	
}

Exemplo de implementar

public static void main(String[] args){

		Pessoa pessoa;
		Repositorio lista = new Repositorio();
		boolean continua = true;
		
		while(continua){
			
			Util.menu();
			int escolhaMenu = Util.leituraInteiro("\nDigite a escolha: ");
			switch (escolhaMenu) {
				case 1://adicionar
					String nome = Util.leituraString("\nInforme o nome: ");
					nome = Util.somenteLetras(nome);
					String cpf = Util.leituraString("Informe o CPF: ");
					cpf = Util.somenteNumeros(cpf);
					int idade = Util.leituraInteiro("Informe a idade: ");
					String estado = Util.leituraString("Informe o estado(UF) : ");
					estado = Util.somenteLetras(estado);
					String cidade = Util.leituraString("Informe a cidade: ");
					cidade = Util.somenteLetras(cidade);
					String telefone = Util.leituraString("Informe o telefone: ");
					telefone = Util.somenteNumeros(telefone);
					
					pessoa = new Pessoa(nome, cpf, idade, estado, cidade, telefone);
					lista.adicionar(pessoa);
					System.out.println(pessoa.getNome() + " Cadastrado(a) com sucesso!!");
					System.out.println("Número: " + pessoa.getId());
					break;
				default:
					System.out.println("Valor incorreto!!");
					break;
			}
S

Desculpe, sou realmente iniciante, não entendi o str = Util.leituraString
Tenho que importar alguma biblioteca para funcionar esse código?
Parece uma leitura de teclado mas não conheço. tentei importar toda a biblioteca java.util.*; mas não resolveu…

carloshsamaral

É utilizado a biblioteca Scanner para fazer a leitura do que foi digitado no teclado.

Importa ela sim.

Scanner scan = new Scanner(System.in);

o New Scanner(System.in); significa que é uma entrada de dados

S

Cara, eu consegui resolver com o código que você passou. Eu não estava entendendo, como disse to iniciando, ai fiquei lendo o código lendo sobre o scanner, pois eu uso a classe Keyboard para capturar dados do teclado... foi então que eu percebi que eu deveria usar o método leituraInteiro no lugar do meu Keyboard... ou seja estou capturando dados com esse método leituraInteiro...
Eu achava que o método que você passou só iria validar então eu estava mantendo o meu método de leitura também no código, mas aí eu peguei a cena... comentei o keyboard e funcionou.. Valeu.
No fim fiz algumas alterações no meu código pra ficar mais fácil entender.

A classe que eu usei que você me passou:

chamei ela de leituraInteiro.java

package Modelos;
import java.util.*;

public class leituraInteiro {
    
    public static int leituraInteiro(String tela){  
        Scanner scan = new Scanner(System.in);  
        System.out.print(tela);  
        String numero = scan.nextLine();  
        int num = 0;  
        boolean conversao = true;  
        while(conversao){  
            try{  
                num = Integer.parseInt(numero);  
                conversao = false;  
            }catch(Exception e){  
                System.out.println("Só é válido numeros inteiros!"+e);  
                  
                numero = scan.nextLine();
            }  
        }  
        return num;  
    } 
}

o trecho do código do meu menu:

//Menu Principal
        System.out.println("Selecione o tipo de colaborador para calculo de pagamento:");
        System.out.println("Digite 1 para Celetista");
        System.out.println("Digite 2 para Pessoa Juridica");
        System.out.println("Digite 0 para Sair");
       
            do {
                x = leituraInteiro.leituraInteiro("Opção:");
                //x = Keyboard.readInt();
                
                    if(x == 1){
                        montaMenuCeletista();
                    }

                    else if(x == 2){
                        montaMenuPJ();
                    }

                    else if(x == 0){
                        System.exit(0);
                    }

Haha, vou fazer mais uns testes e ja renomeio pra resolvido...
Obrigadoo!!

carloshsamaral

Fico feliz em poder te ajudar ! :slight_smile:

Como te passei umas validações tu pode fazer uma classe só pra isso =]
Valida se o nome só tem letras e etc… Qualquer coisa só falar!

Criado 13 de outubro de 2015
Ultima resposta 15 de out. de 2015
Respostas 9
Participantes 2