Ir ao conteúdo
  • Cadastre-se

Java Limpar o Buffer de teclado na ling JAVA


Posts recomendados

Pessoal, estou iniciando meus estudos em Java e me deparei com um problema...

Estou criando um app para ler alguns dados, conforme código abaixo:

package central;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
        
      Scanner sc = new Scanner (System.in);	
      
	   System.out.println("Digite o numero da conta\n");
       int numero = sc.nextInt();
		
       System.out.println("Digite o nome do titular da conta");
        
       String nome = sc.nextLine(); //////////////////////// ESSE COMANDO NÃO É EXECUTADO, SIMPLESMENTE PULA
        
       System.out.printf("Você Deseja realizar um deposito inicial?\nDigite (S) para sim e (N) para não");
	   String op = sc.nextLine();
	    
          if (op == "S") {                          /////// ESSA COMPARAÇÃO NÃO FUNCIONA, JÁ TENTEI COM ASPAS SIMPLES E NADA também...
	    	System.out.printf("Digite o Valor do deposito inicial");
	    	int deposito = sc.nextInt();
	    	sc.close();
	    }
	    }
	}

Como escrevi no código, a linha para leitura da variável 'nome' é ignorada, isso me lembrou muito do comando fflush(stdin) em C, que realizava a limpeza do buffer, quando esse tipo de problema acontecia em C. 

Então gostaria de saber: é realmente problema de limpeza de buffer, ou alguma outra coisa? E se sim, como faço esse comando? Não achei nada esclarecedor na internet...

Também não entendo porque meu "if ...==...'S' " não funciona também...

Obrigado desde já!

2019_12_25_10_48_43_proje_ProjetoBanco_src_central_Main.java_Eclipse_IDE.jpg

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Fábio Henrique Borecki Isso acontece após ler um valor não alfanumérico (números, por exemplo), onde o valor é armazenado na variável, mas o ENTER continua no buffer. Você precisa verificar se esse ENTER está presente e removê-lo. Para isso crie uma função que receba o objeto Scanner por parâmetro e faça os devidos procedimentos.

 

Algo assim pode resolver:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);

        System.out.print("Digite o numero da conta: ");
        int numero = sc.nextInt();
        clearBuffer(sc);

        System.out.print("Digite o nome do titular da conta: ");
        String nome = sc.nextLine();

        System.out.print("Você Deseja realizar um deposito inicial? [ S / N ]: ");
        String op = sc.next();

        if (op.equals("S")) {
            System.out.print("Digite o Valor do deposito inicial: ");
            int deposito = sc.nextInt();
            clearBuffer(sc);
            sc.close();
        }
    }

    private static void clearBuffer(Scanner scanner) {
        if (scanner.hasNextLine()) {
            scanner.nextLine();
        }
    }
}

Perceba que a função clearBuffer é chamada após o nextInt, isso porque o nextInt armazena valores não alfanuméricos. No caso dos métodos next e nextLine o ENTER é armazenado dentro da variável, dessa forma, ele não precisa ser consumido.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@Fábio Henrique Borecki Bom dia. Não sei se a solução que passarei aqui é a melhor indicada. Também estou iniciando os estudos em Java e, portanto, pode não funcionar sempre ou dar outro tipo de problema futuro, mas até onde testei, funcionou. 

 

1º Problema: Neste caso seria adicionar simplesmente um "sc.nextLine()" antes do "String nome", isso faria essa limpa da variável anterior e permitiria o valor seguinte ser ligo.

 

2º Problema: Outro problema que enfrentei logo nos primeiros dias com o Java, foi definir uma String X, e colocá-la como condição de um IF, eu fazia da mesma forma como você fez e sempre dava algum problema, até que passei a usar o "char op = sc.next().charAt(0)", a partir disso o problema foi resolvido.

 

Coloquei no código abaixo para melhor entendimento.  Espero ter ajudado.

 

  System.out.println("Digite o numero da conta\n");
	       int numero = sc.nextInt();
	       sc.nextLine();    // adicionei a presente linha para limpar as informações e evitar que a "String nome" seja pulada.
			
	       System.out.println("Digite o nome do titular da conta");
	       String nome = sc.nextLine();
	        
	       System.out.printf("Você Deseja realizar um deposito inicial?\nDigite (S) para sim e (N) para não");
	       // String op = sc.nextLine();  
	       char op = sc.next().charAt(0);    // alterei o "String op" pelo "char op", colocando-o no IF abaixo com aspas simples na condição (op == 'S')       
		    
	          if (op == 'S') {                          
		    	System.out.printf("Digite o Valor do deposito inicial");
		    	int deposito = sc.nextInt();
		    	sc.close();
		    }

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!