Bug ao receber String endereço do Scan

Olá galera tudo bem ? então sou iniciante com java e programação em si,
estou tendo 2 problemas:
Eu estou desenvolvendo um cadastro de Cliente então eu criei minha entidade Cliente

package br.com.zup.model;

public class Cliente {

private String nome;
private int idade;
private Long cpf;
private String email;
private int telefone;
private String endereco;


public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public int getIdade() {
	return idade;
}

public void setIdade(int idade) {
	this.idade = idade;
}

public Long getCpf() {
	return cpf;
}

public void setCpf(Long cpf) {
	this.cpf = cpf;
}

public String getEmail() {
	return email;
}

public void setEmail(String email) {
	this.email = email;
}

public int getTelefone() {
	return telefone;
}

public void setTelefone(int telefone) {
	this.telefone = telefone;
}

public String getEndereco() {
	return endereco;
}

public void setEndereco(String endereco) {
	this.endereco = endereco;
}

}

e minha classe principal

package br.com.zup.cadastro;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import br.com.zup.model.Cliente;

public class Main {

private static final int DIGITO_MAX_SUBMENU = 2;
private static final int DIGITO_MIN_SUBMENU = 0;
private static final String MSG_DE_INSTRUCAO_DO_MENU = "Olá seja bem vindo ao seu sistema de cadastro de clientes!"
		+ " \nDigite :\n 1-[para inserir cadastro]\n 2-[para alterar cadastro]\n 3-[para buscar cadastro ]\n 4-[para deletar cadastro]\n 0-[para ENCERRAR]";
private static final String INSTRUCOES_SUBMENU = "Digite:\n1-[para buscar por um cliente]\n2-[Para buscar a lista de clientes]\n0-[para SAIR]";
private static final String DIGITE_O_CPF_PARA_DELETE = "Digite o cpf do cliente para excluir o cadastro :";
private static final String DIGITE_O_CPF_PARA_ALTERAR_CADASTRO = "Digite o cpf do cliente para alterar o cadastro :";
private static final String DIGITE_O_ENDERECO = "Digite o endereço :";
private static final String DIGITE_O_TELEFONE = "Digite o telefone :";
private static final String DIGITE_EMAIL = "Digite email :";
private static final String DIGITE_O_CPF = "Digite o cpf :";
private static final String DIGITE_A_IDADE = "Digite a idade :";
private static final String DIGITE_O_NOME = "Digite o nome :";
private static final String DIGITE_UMA_OPERACAO_VALIDA = "\nDigite uma operação válida\n";
private static final String TELEFONE = "Número de telefone: ";
private static final String ENDERECO = "Endereço físico: ";
private static final String E_MAIL = "Endereço de e-mail: ";
private static final String CPF = "CPF: ";
private static final String IDADE = "Idade: ";
private static final String NOME = "Nome do cliente: ";
private static final int DIGITO_MAX = 4;
private static final int DIGITO_MIN = 0;
private static Map<Long, Cliente> listaClientes;

public static void main(String[] args) {

	Scanner teclado = new Scanner(System.in);

	listaClientes = new HashMap<Long, Cliente>();

	int operacao;

	do {

		System.out.println(MSG_DE_INSTRUCAO_DO_MENU);
		operacao = teclado.nextInt();
		if (operacao < DIGITO_MIN || operacao > DIGITO_MAX) {
			System.out.println(DIGITE_UMA_OPERACAO_VALIDA);

		}

		switch (operacao) {

		case 1:
			adicionaCliente(teclado);
			break;

		case 2:
			alteraCadastro(teclado);
			break;

		case 3:
			subMenuDeBusca(teclado);
			break;

		case 4:
			excluirCadastro(teclado);
			break;

		default:
			break;
		}

	} while (operacao != 0);

}

public static void adicionaCliente(Scanner teclado) {

	Cliente clienteAdicionado = new Cliente();
	

	System.out.printf(DIGITE_O_NOME);
	clienteAdicionado.setNome(teclado.next());
	System.out.printf(DIGITE_A_IDADE);
	clienteAdicionado.setIdade(teclado.nextInt());
	System.out.printf(DIGITE_O_CPF);
	clienteAdicionado.setCpf(teclado.nextLong());
	System.out.printf(DIGITE_EMAIL);
	clienteAdicionado.setEmail(teclado.next());
	System.out.printf(DIGITE_O_TELEFONE);
	clienteAdicionado.setTelefone(teclado.nextInt());
	System.out.printf(DIGITE_O_ENDERECO);
	clienteAdicionado.setEndereco(teclado.next());
	teclado.nextLine();

	listaClientes.put(clienteAdicionado.getCpf(), clienteAdicionado);
	
	
}

public static void buscaCliente(Scanner teclado) {

	System.out.println(DIGITE_O_CPF);
	Long cpf = teclado.nextLong();
	Cliente cliente = listaClientes.get(cpf);
	
	clienteBuscado(cliente);

}

public static void buscaListaDeClientes() {
	for (Cliente cliente : listaClientes.values()) {
		clienteBuscado(cliente);

	}

}

public static void alteraCadastro(Scanner teclado) {

	System.out.println(DIGITE_O_CPF_PARA_ALTERAR_CADASTRO);
	Long cpf = teclado.nextLong();
	Cliente clienteAlterado = listaClientes.get(cpf);

	System.out.printf(DIGITE_O_NOME);
	clienteAlterado.setNome(teclado.next());
	System.out.printf(DIGITE_A_IDADE);
	clienteAlterado.setIdade(teclado.nextInt());
	System.out.printf(DIGITE_EMAIL);
	clienteAlterado.setEmail(teclado.next());
	System.out.printf(DIGITE_O_TELEFONE);
	clienteAlterado.setTelefone(teclado.nextInt());
	System.out.printf(DIGITE_O_ENDERECO);
	clienteAlterado.setEndereco(teclado.next());

	listaClientes.put(cpf, clienteAlterado);
	clienteBuscado(clienteAlterado);

}

public static void excluirCadastro(Scanner teclado) {
	System.out.println(DIGITE_O_CPF_PARA_DELETE);
	Long cpf = teclado.nextLong();
	listaClientes.remove(cpf);

}

public static void clienteBuscado(Cliente clienteBuscado) {

	System.out.println(NOME + clienteBuscado.getNome());
	System.out.println(IDADE + clienteBuscado.getIdade());
	System.out.println(CPF + clienteBuscado.getCpf());
	System.out.println(E_MAIL + clienteBuscado.getEmail());
	System.out.println(ENDERECO + clienteBuscado.getEndereco());
	System.out.println(TELEFONE + clienteBuscado.getTelefone());

}

public static void subMenuDeBusca(Scanner teclado) {

	int operacao;

	do {

		System.out.println(INSTRUCOES_SUBMENU);
		operacao = teclado.nextInt();
		if (operacao < DIGITO_MIN_SUBMENU || operacao > DIGITO_MAX_SUBMENU) {
			System.out.println(DIGITE_UMA_OPERACAO_VALIDA);
		}

		switch (operacao) {

		case 1:
			buscaCliente(teclado);

		case 2:
			buscaListaDeClientes();

		}

	} while (operacao != 0);

}

}

Quando eu rodo no console e começo a fazer a inserção do meu cliente acontece o seguinte:
1- quando eu coloco o endereço com espaço se eu usar só o teclado.next(); ele estoura uma Exception in thread “main” java.util.InputMismatchException;
Se eu colocar ;
clienteAdicionado.setEndereco(teclado.next());
teclado.nextLine() ele não da Excption porém ele só grava a primeira parava antes do espaço por exemplo : “Barra Funda”
ele só grava em endereço “Barra”

2- o outro problema é que quando eu faço minha “busca” por 1 cadastro eu busco pelo cpf ele duplica o o valor.
trazendo 2x o cadastro.

Obrigado galera!

Para ler do teclado não uses nextInt / next mas apenas o nextLine e converte para o tipo desejado senão vais ter estes problemas estranhos com a quebra de linha (enter)

1 curtida