Caso Entrada de teclado de String não funcionando(MUITO estranho)

7 respostas
V

Alguem sabe responder os qustionamentos no código abaixo?
Ignorem os comentários que tem clientePF e clientePJ, além de não influirem no problema, são classes do meu código e estão em outro arquivo.
Quando chega na entrada do nome do clientePF e no nome fantasia do clientePJ, ambos configurados para dar entrada de uma string com input.nextLine, não da a opção de entrada de teclado e pula para o próximo.

import java.util.*;

public class CadastroClientes{
  public static void main (String[] args){
    //PessoaF clientePF = new PessoaF();
    //PessoaJ clientePJ = new PessoaJ();
    System.out.println("*******CADASTRO DE CLIENTES*******");
    System.out.println(" ");
                       
    int op=0;
    do{
    Scanner input = new Scanner(System.in);
    System.out.println("Selecione a Opção desejada");
    System.out.println("1 - Cadastro Pessoa Física");
    System.out.println("2 - Cadastro Pessoa Jurídica");
    System.out.println("3 - Listar dados de Pessoa Física");
    System.out.println("4 - Listar dados de Pessoa Jurídica");
    System.out.println("0 - Sair");
    System.out.print("OPÇÃO: ");
    op = input.nextInt();
    while(op!=1 && op!=2 && op!=0 && op!=3 && op!=4){
     System.out.println("***OPÇÃO INVÁLIDA***");
     System.out.print("Digite a opção novamente: ");
     op = input.nextInt();
    }              
    switch(op){
      case 1:{
        System.out.println("** Cadastro de Cliente PF **");
                
        System.out.print("Digite o Nome: "); // ****POR QUE NÃO VAI PARA A ENTRADA DE TECLADO NESTA PARTE???
        String nome = input.nextLine();      // ***SE COLOCAR APENAS NEXT AO INVEZ DE NEXTLINE FUNCIONA, MAS PRECISO DO NEXTLINE
        //clientePF.setNome(nome);
        
        System.out.print("Digite o Código: ");
        int cod = input.nextInt();
        //clientePF.setCodigo(cod);

        System.out.print("Digite o CPF: ");
        String cpf = input.next();
        //clientePF.setCpf(cpf);

        System.out.print("Digite o RG: ");
        String rg = input.next();
        //clientePF.setRg(rg);
        
        System.out.print("Digite a Data de Nascimento: ");
        String data = input.nextLine();
        //clientePF.setDtnascimento(data);
        
        System.out.print("Digite o Telefone: ");
        String tel = input.nextLine();
        //clientePF.setTelefone(tel);
        
        System.out.print("Digite o Endereço: ");
        String end = input.nextLine();
        //clientePF.setEndereco(end);
        
        System.out.print("Digite o CEP: ");
        String cep = input.next();
        //clientePF.setCep(cep);
                       
       }break;
       
      case 2:{
        System.out.println("** Cadastro de Cliente PJ **");
              
        System.out.print("Digite o Código: ");
        int cod = input.nextInt();
        //clientePJ.setCodigo(cod);
        
        System.out.print("Digite a Razão Social: ");
        String razao = input.nextLine();
        //clientePJ.setRazaosocial(razao);
        
        System.out.print("Digite o Nome Fantasia: ");  // ****POR QUE NÃO VAI PARA A ENTRADA DE TECLADO NESTA PARTE???
        String nome = input.nextLine();                // ***SE COLOCAR APENAS NEXT AO INVEZ DE NEXTLINE FUNCIONA, MAS PRECISO DO NEXTLINE
        //clientePJ.setNomefantasia(nome);
        
        System.out.print("Digite o CNPJ: ");
        String cnpj = input.nextLine();
        //clientePJ.setCnpj(cnpj);
        
        System.out.print("Digite a Inscrição Estadual: ");
        String ie = input.nextLine();
        //clientePJ.setIe(ie);
                
        System.out.print("Digite o Telefone: ");
        String tel = input.nextLine();
        //clientePJ.setTelefone(tel);
        
        System.out.print("Digite o Endereço: ");
        String end = input.nextLine();
        //clientePJ.setEndereco(end);
        
        System.out.print("Digite o CEP: ");
        String cep = input.nextLine();
        //clientePJ.setCep(cep);
       }break;
      
      /*case 3:{
        System.out.println("** Dados do Cliente PF **");
                
        //int cod = clientePF.getCodigo();
        System.out.println("Código: " +cod);
        
        String nome = clientePF.getNome();
        System.out.println("Nome: " +nome);
        
        //String cpf = clientePF.getCpf();
        System.out.println("CPF: " +cpf);
        
        //String rg = clientePF.getRg();
        System.out.println("Digite o RG: " +rg);
        
        //String data = clientePF.getDtnascimento();
        System.out.println("Data de Nascimento: " +data);
        
        //String tel = clientePF.getTelefone();
        System.out.println("Digite o Telefone: " +tel);
        
        //String end = clientePF.getEndereco();
        System.out.println("Digite o Endereço: " +end);
        
        //String cep = clientePF.getCep();
        System.out.println("CEP: " +cep);
       }break;*/
     }
    }while(op!=0);
  }
}

7 Respostas

iagodantascg

Este é um erro bem comun da classes Scanner. Se você usar um pouco mais dela vai descobrir mais alguns erros.
O que está acontecendo, muito provavelmente, é o seguinte. Durante a execursão, quando o nextLine() é chamado e o usuário passa um valor, a classe Scanner em vez de armazernar o valor na variavel do tipo String que vc criou, está apenas recebendo e deixando ela no Buffer do Scanner.
Depois do trexo:

System.out.print("Digite o Nome: "); // ****POR QUE NÃO VAI PARA A ENTRADA DE TECLADO NESTA PARTE??? String nome = input.nextLine(); // ***SE COLOCAR APENAS NEXT AO INVEZ DE NEXTLINE FUNCIONA, MAS PRECISO DO NEXTLINE
Adiciona a linha: nome = input.next();
O método next() da classe retorna o valor armazenado no Buffer do Scanner. Sendo assim, se o valor está sendo preso lá, este metodo vai retornar a string adquirida anteriormente.

Espero ter ajudado. Seu codigo deve ficar assim:

System.out.print("Digite o Nome: "); String nome = input.nextLine(); nome = input.next();

alexandref93

eu utilizo só o nextLine(); e funciona na boa, testei agora mesmo aqui!!!

V

iago, muito obrigado pela colaboração, porém, fazendo do modo que você falou, o comando String nome = input.nextLine é ignorado e entra direto no nome = input.net();

O problema de usar somente o next, é que da erro se eu digito o sobrenome. Ex.: Vagner Nascimento


Alexandre, eu estou usando o Dr. Java de complidor, isso para aprender bem a liguagem antes de usar um compilcador melhor como o Net Beans.
Qual compilador você testou e funcionou o nextLine?

Grato por hora…

Abraços

alexandref93

Vagnernasc:
iago, muito obrigado pela colaboração, porém, fazendo do modo que você falou, o comando String nome = input.nextLine é ignorado e entra direto no nome = input.net();

O problema de usar somente o next, é que da erro se eu digito o sobrenome. Ex.: Vagner Nascimento


Alexandre, eu estou usando o Dr. Java de complidor, isso para aprender bem a liguagem antes de usar um compilcador melhor como o Net Beans.
Qual compilador você testou e funcionou o nextLine?

Grato por hora…

Abraços

Olá Vagner!

Pelo que eu percebi, vc é novo no java, :smiley: o javac é o único compilador que existe que eu conheço, o NetBeans é uma IDE (um programa auxiliar pra te facilita e agilizar mais o processo), o mesmo vale para o Dr. Java, e tem o Eclipse se quiser conhecer , vai testando vários e vê qual vc melhor se dá bem :smiley: , e todos eles usam o javac pra compilar, e quanto ao nextLine(); ele funciona normal, pelo menos funciona muito melhor que o next(); que “pula” de linha sempre!!!

davidbuzatto

Isso não é um erro da classe Scanner. Ela faz exatamente o que você “manda” ela fazer.
Que tal dar uma lida na documentação? http://download.oracle.com/javase/6/docs/api/java/util/Scanner.html

[]´s

adriano_kahn

experimente usar next() em vez de nextLine()…

V

Não teve jeito… rsrsr
Abandonei o Scanner, vo fazer com swing que é mais garantido!! :smiley:

Valeu galera…

Abraçss

Criado 5 de novembro de 2010
Ultima resposta 6 de nov. de 2010
Respostas 7
Participantes 5