1
resposta

Dúvida com teclado.nextInt()

public void solicitarPedido() {
        System.out.printf("Digite o nome do cliente: ");
        String nomeCliente = teclado.nextLine();

        while (nomeCliente.isEmpty()) {
            System.out.print("O nome do cliente não pode estar vazio. Digite novamente: ");
            nomeCliente = teclado.nextLine();
        }

        Cliente cliente = new Cliente(nomeCliente);
        int codigoProduto;

        while(true) {
            System.out.printf("Digite o código do produto: ");
            //if(teclado.hasNextInt()) {
                codigoProduto = teclado.nextInt();
                if(cardapio.retornarProduto(codigoProduto) != null) {
                    Produto produto = cardapio.retornarProduto(codigoProduto);
                    cliente.getProdutos().add(produto);

                    System.out.print("Deseja adicionar mais produtos? [1 - sim / 2 - não]: ");
                    int opcao = teclado.nextInt();

                    while(opcao < 1 || opcao > 2) {
                        System.out.print("Deseja adicionar mais produtos? [1 - sim / 2 - não]: ");
                        opcao = teclado.nextInt();
                    }

                    if(opcao == 2) {
                        break;
                    }
                }
            //}    
            System.out.println("Código do produto inválido. Tente novamente!");
            teclado.nextLine();
        }
        Pedido pedido = new Pedido(codigoPedido++, cliente, cliente.getProdutos(), 1);
        pedidos.adicionarPedidos(pedido);
    }

Dúvida: Esse código tem um problema que, quando o usuário não digita nada na variável codigoProduto(), as entradas vazias parecem que vão sendo acumuladas e quando o usuário digitar uma letra, ao invés, de um num número, a quantidade de vezes que ele digitou a entrada vazia vai ser a quantidade de vezes que vai aparecer essa mensagem: System.out.println("Código do produto inválido. Tente novamente!"); Então o problema é esse, era para aparecer apenas uma vez essa mensagem mas aparece mais de uma vez.

Como posso melhorar o código para fazer todas as verificações para que o usuário não digite uma letra no código do produto, para que o nome do cliente não tenha números e não possa estar vazio?

1 resposta

Olá, Luidi!

Para resolver o problema de acumular as entradas vazias na variável codigoProduto, você pode adicionar um teclado.nextLine() após a mensagem de erro "Código do produto inválido. Tente novamente!". Isso irá descartar a entrada inválida e permitir que o usuário insira um novo valor.

Além disso, para garantir que o usuário não digite uma letra no código do produto, você pode utilizar o método teclado.hasNextInt() para verificar se a próxima entrada é um número inteiro. Caso não seja, você pode exibir a mensagem de erro e descartar a entrada inválida usando teclado.nextLine().

Para evitar que o nome do cliente tenha números e não possa estar vazio, você já está utilizando um laço while para verificar se o nome está vazio. Para garantir que o nome não tenha números, você pode utilizar expressões regulares. Por exemplo, você pode utilizar o método nomeCliente.matches("[a-zA-Z\\s]+") para verificar se o nome contém apenas letras e espaços em branco.

Aqui está o código atualizado com as melhorias mencionadas:

public void solicitarPedido() {
    System.out.printf("Digite o nome do cliente: ");
    String nomeCliente = teclado.nextLine();
    
    while (nomeCliente.isEmpty() || !nomeCliente.matches("[a-zA-Z\\s]+")) {
        System.out.print("O nome do cliente não pode estar vazio ou conter números. Digite novamente: ");
        nomeCliente = teclado.nextLine();
    }
    
    Cliente cliente = new Cliente(nomeCliente);
    int codigoProduto;
    
    while(true) {
        System.out.printf("Digite o código do produto: ");
        if(teclado.hasNextInt()) {
            codigoProduto = teclado.nextInt();
            if(cardapio.retornarProduto(codigoProduto) != null) {
                Produto produto = cardapio.retornarProduto(codigoProduto);
                cliente.getProdutos().add(produto);
                
                System.out.print("Deseja adicionar mais produtos? [1 - sim / 2 - não]: ");
                int opcao = teclado.nextInt();
                
                while(opcao < 1 || opcao > 2) {
                    System.out.print("Deseja adicionar mais produtos? [1 - sim / 2 - não]: ");
                    opcao = teclado.nextInt();
                }
                
                if(opcao == 2) {
                    break;
                }
            }
        } else {
            System.out.println("Código do produto inválido. Tente novamente!");
            teclado.nextLine(); // Descartar entrada inválida
        }
    }
    Pedido pedido = new Pedido(codigoPedido++, cliente, cliente.getProdutos(), 1);
    pedidos.adicionarPedidos(pedido);
}

Espero ter ajudado e bons estudos!