Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
Postado

@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();
		    }

 

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