Problema com leitura do teclado

Boa tarde, pessoal. Estou tentando ler 3 entradas do teclado porém, parece que algumas “Passam reto”.

import java.util.Scanner;

/**
 * Classe que vai testar a classe Funcionario, 
 * instanciando novos objetos da mesma e chamando os metodos
 * @author dede
 */
public class FuncionarioTestDrive {
	
	public static void main(String[] args) {
		Scanner leitor = new Scanner(System.in);
		Funcionario func = new Funcionario(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:

Alguém sabe o que pode ser?

Abraços.

Que tal nos motrar o seu método “mostraInfo()” ???

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
 */
public class Funcionario {
	
	/*
	 * Variaveis de instancia
	 */
	private int codigo;
	private int fone;
	private String nome;
	
	/**
	 * Construtor da classe Funcionario
	 * @param novoCodigo, novoFone, novoNome Os novos atributos do funcionario
	 */
	public Funcionario(int novoCodigo, int novoFone, String novoNome) {
		codigo = novoCodigo;
		fone = novoFone;
		nome = novoNome;
	}
	
	/**
	 * Metodo acessador de codigo
	 * @return codigo O codigo do funcionario
	 */
	public int getCodigo() {
		return codigo;
	}
	
	/**
	 * Metodo acessador de fone
	 * @return fone O fone do funcionario
	 */
	public int getFone() {
		return fone;
	}
	
	/**
	 * Metodo acessador de nome
	 * @return nome O nome do funcionario
	 */
	public String getNome() {
		return nome;
	}
	
	/**
	 * Metodo modificador de codigo
	 * @param novoCodigo O novo codigo do funcionario
	 */
	public void setCodigo(int novoCodigo) {
		codigo = novoCodigo;
	}
	
	/**
	 * Metodo modificador de fone
	 * @param novoFone O novo fone do funcionario
	 */
	public void setFone(int novoFone) {
		fone = novoFone;
	}
	
	/**
	 * Metodo modificar de nome
	 * @param novoNome O novo nome do funcionario
	 */
	public void setNome(String novoNome) {
		nome = novoNome;
	}
	
	/**
	 * Metodo que vai mostrar as informacoes do funcionario
	 */
	public void mostraInfo() {
		System.out.println("Funcionario " + codigo);
		System.out.println("Nome: " + nome);
		System.out.println("Fone: " + fone);
		System.out.println("");
	}	
}

Bem, isso deve te ajudar, agora é tenta recriar a lógica…

http://www.guj.com.br/posts/list/74470.java

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

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!!

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.

[quote]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![/quote]

O que poderia ser isso?

Abraço!

afinal de contas o que vc quer?
olha essa classe que acabei de fazer:


import java.util.Scanner;
class Scan{

public static void main(String arg[]){
	Scanner sc = new Scanner(System.in);
	
System.out.println("Digite seu nome");
	String nome = sc.nextLine();
System.out.println("Digite seu cpf");
	int cpf = sc.nextInt();
System.out.println("Nome e cpf " + nome  + cpf);

}
}

flw!!

Que estranho não funciona isso. Fico meio feio, mas resolvi o problema.

[code]
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
	Scanner leitor = new Scanner(System.in);
	Funcionario func = new Funcionario(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: ");
	String nome1 = leitor.next();
	String nome2 = leitor.nextLine();
	
	String nome = 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");
}

}[/code]

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…

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 :slight_smile:

guilherme.cq,

Concordo com você.

Então, a dúvida ainda persiste.

[quote=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 :slight_smile:

guilherme.cq,

Concordo com você.

Então, a dúvida ainda persiste.[/quote]

certo… mais pq nao funcionou o seu? olha o meu ai… ele leu um depois o outro… tranquilo…

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.

Achei esse link, lá tem algumas explicações.

http://forum.java.sun.com/thread.jspa?threadID=718569&messageID=4148209

:slight_smile:

Migore,

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:

             cout << "New name: ";
              cin.sync();
              getline( cin, course );
              myGradeBook.setCourseName(course);

Mas não convém ao caso.

O código em Java ficou assim:

import java.util.Scanner;

/**
 * Classe que vai testar a classe Funcionario, 
 * instanciando novos objetos da mesma e chamando os metodos
 * @author dede
 */
public class FuncionarioTestDrive {

        public static void main(String[] args) {
                Scanner leitor = new Scanner(System.in);
                Funcionario func = new Funcionario(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");
        }

}

Muito obrigado a todos que ajudaram no tópico.

Problema resolvido :slight_smile:

Abraços.