Boa tarde, pessoal. Estou tentando ler 3 entradas do teclado porém, parece que algumas “Passam reto”.
importjava.util.Scanner;/** * Classe que vai testar a classe Funcionario, * instanciando novos objetos da mesma e chamando os metodos * @author dede */publicclassFuncionarioTestDrive{publicstaticvoidmain(String[]args){Scannerleitor=newScanner(System.in);Funcionariofunc=newFuncionario(0,0,"");System.out.print("Digite o codigo do funcionario: ");func.setCodigo(leitor.nextInt());System.out.print("Digite agora o fone do funcionario: ");func.setFone(leitor.nextInt());System.out.print("Digite agora o nome do funcionario: ");func.setNome(leitor.nextLine());System.out.println("Agora, vamos exibir as informacoes do funcionario");System.out.println("");func.mostraInfo();System.out.println("Fim!\n");}}
Eu consigo inserir o código e o fone. Na verdade, quando insiro o código, parece que pula uma linha e ainda assim não faz nada (o cursor fica na segunda linha e nao na terceira que é o do fone (onde deveria ficar)). A saída para algo simples fica assim:
Que tal nos motrar o seu método “mostraInfo()” ???
Andre_Brito
Opa, foi mal.
Vou postar a classe toda aqui.
Isso parece aquele problema do buffer cheio que acontece em C e C++. Achei que tinha me livrado do problema quando aprendi Java, mas pelo visto tem alguma coisa de errado.
/** * Classe que vai guardar cada funcionario * @author dede */publicclassFuncionario{/* * Variaveis de instancia */privateintcodigo;privateintfone;privateStringnome;/** * Construtor da classe Funcionario * @param novoCodigo, novoFone, novoNome Os novos atributos do funcionario */publicFuncionario(intnovoCodigo,intnovoFone,StringnovoNome){codigo=novoCodigo;fone=novoFone;nome=novoNome;}/** * Metodo acessador de codigo * @return codigo O codigo do funcionario */publicintgetCodigo(){returncodigo;}/** * Metodo acessador de fone * @return fone O fone do funcionario */publicintgetFone(){returnfone;}/** * Metodo acessador de nome * @return nome O nome do funcionario */publicStringgetNome(){returnnome;}/** * Metodo modificador de codigo * @param novoCodigo O novo codigo do funcionario */publicvoidsetCodigo(intnovoCodigo){codigo=novoCodigo;}/** * Metodo modificador de fone * @param novoFone O novo fone do funcionario */publicvoidsetFone(intnovoFone){fone=novoFone;}/** * Metodo modificar de nome * @param novoNome O novo nome do funcionario */publicvoidsetNome(StringnovoNome){nome=novoNome;}/** * Metodo que vai mostrar as informacoes do funcionario */publicvoidmostraInfo(){System.out.println("Funcionario "+codigo);System.out.println("Nome: "+nome);System.out.println("Fone: "+fone);System.out.println("");}}
G
guilherme.cq
Bem, isso deve te ajudar, agora é tenta recriar a lógica…
nesse topico fala sobre o , mas no programa ele sempre busca por char… nao sei como deve ficar no seu programa… eu faria igual o seu e pegaria o msm bug…
dps mande o programa resolvido!
abraço
LPJava
faça isso:
System.out.println("\nAgora, vamos exibir as informacoes do funcionario\n");
vc tb pode trocar o nextLine por next
olha ai agora!!
Andre_Brito
Amigos, ainda não deu certo.
A saída quando coloco os “\n” é:
Quando uso o next em vez do nextLine, eu consigo ler apenas 1 nome, mas todos não.
Digite o codigo do funcionario: 1
Digite agora o fone do funcionario: 1
Digite agora o nome do funcionario: Joao Joao Joao
Agora, vamos exibir as informacoes do funcionario
Funcionario 1
Nome: Joao
Fone: 1
Fim!
O que poderia ser isso?
Abraço!
LPJava
afinal de contas o que vc quer?
olha essa classe que acabei de fazer:
importjava.util.Scanner;classScan{publicstaticvoidmain(Stringarg[]){Scannersc=newScanner(System.in);System.out.println("Digite seu nome");Stringnome=sc.nextLine();System.out.println("Digite seu cpf");intcpf=sc.nextInt();System.out.println("Nome e cpf "+nome+cpf);}}
flw!!
Migore
Que estranho não funciona isso. Fico meio feio, mas resolvi o problema.
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerleitor=newScanner(System.in);Funcionariofunc=newFuncionario(0,0,"");System.out.print("Digite o codigo do funcionario: ");func.setCodigo(leitor.nextInt());System.out.print("Digite agora o fone do funcionario: ");func.setFone(leitor.nextInt());System.out.println("Digite agora o nome do funcionario: ");Stringnome1=leitor.next();Stringnome2=leitor.nextLine();Stringnome=nome1+nome2;func.setNome(nome);System.out.println("\nAgora, vamos exibir as informacoes do funcionario");System.out.println("");func.mostraInfo();System.out.println("Fim!\n");}}
G
guilherme.cq
O q vc fez simplesmente pegar o ‘enter’ do nextLine() q seria um caracter em branco e concatenar com o nome realmente… isso á uma gambi… vc poderia pegar o nom1 e mostrar apenas o nome2…
Andre_Brito
LPJava,
Eu quero isso que você falou: que o usuário insira dados pelo teclado, porém, o nome do funcionário não está sendo pego (ele passa direto quando uso nextLine() e pega somente 1 quando uso next()).
Migore,
Eu acho que ficou “BEM” feio… é uma gabiarra das boas essa, hehehe. Apesar de funcionar, eu gostaria de usar somente códigos não-gambiarras, entende? Mas obrigado pela solução
guilherme.cq,
Concordo com você.
Então, a dúvida ainda persiste.
LPJava
dedejava:
LPJava,
Eu quero isso que você falou: que o usuário insira dados pelo teclado, porém, o nome do funcionário não está sendo pego (ele passa direto quando uso nextLine() e pega somente 1 quando uso next()).
Migore,
Eu acho que ficou “BEM” feio… é uma gabiarra das boas essa, hehehe. Apesar de funcionar, eu gostaria de usar somente códigos não-gambiarras, entende? Mas obrigado pela solução
guilherme.cq,
Concordo com você.
Então, a dúvida ainda persiste.
certo… mais pq nao funcionou o seu? olha o meu ai… ele leu um depois o outro… tranquilo…
Andre_Brito
Camlio,
Pois é cara. É essa a minha dúvida. Ele não pega a string do nome do funcionário. Eu to achando muito estranho. Nunca tive esse tipo de problema.
EDIT:
Bom, eu refatorei pra ele inserir o nome do funcionário antes de tudo (antes do código e antes do fone) e deu certo, ele conseguiu ler a entrada. Porém, queria que o usuário entrasse com o nome depois de inserir o código. É aí que está o problema.
EDIT2:
Tentei refatorar para o usuário inserir o nome depois de colocar o código e apresentou o seguinte “bug”:
Não me deixa ler o nome do funcionário. Eu acredito que seja algum problema tosco de buffer ou algo que estou fazendo errado.
Valeu!
Hehe. Li o tópico e realmente resolveu o problema. É uma pena saber que existe esse problema (ainda). Em C++ tive um problema parecida. A captura de strings passava direto, então eu tive que usar o cyn.sync da seguinte maneira:
importjava.util.Scanner;/** * Classe que vai testar a classe Funcionario, * instanciando novos objetos da mesma e chamando os metodos * @author dede */publicclassFuncionarioTestDrive{publicstaticvoidmain(String[]args){Scannerleitor=newScanner(System.in);Funcionariofunc=newFuncionario(0,0,"");System.out.print("Digite o codigo do funcionario: ");func.setCodigo(leitor.nextInt());/* * Aqui eu preciso pegar a proxima linha, porque o nextLine() * pega ja o que existe no buffer do teclado. */leitor.nextLine();System.out.print("Digite agora o nome do funcionario: ");func.setNome(leitor.nextLine());System.out.print("Digite agora o fone do funcionario: ");func.setFone(leitor.nextInt());System.out.println("\nAgora, vamos exibir as informacoes do funcionario\n");System.out.println("");func.mostraInfo();System.out.println("Fim!\n");}}