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:
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("");
}
}
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…
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);
}
}
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…
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
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.[/quote]
certo… mais pq nao funcionou o seu? olha o meu ai… ele leu um depois o outro… tranquilo…
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:
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");
}
}