9
respostas

Erro InputMismatchException

Ao tentar a digitar opção no menu da erro de InputMismatchException Insira aqui a descrição dessa imagem para ajudar na acessibilidade

9 respostas

Oii, Diego

Consegue mandar seu código pra gente analisar aqui?

package br.com.alura.bytebank;

import br.com.alura.bytebank.domain.RegraDeNegocioException;
import br.com.alura.bytebank.domain.cliente.DadosCadastroCliente;
import br.com.alura.bytebank.domain.conta.ContaService;
import br.com.alura.bytebank.domain.conta.DadosAberturaConta;

import java.util.Scanner;

public class BytebankApplication {

    private static ContaService service = new ContaService();
    private static Scanner teclado = new Scanner(System.in).useDelimiter("\n");

    public static void main(String[] args) {
        var opcao = exibirMenu();
        while (opcao != 7) {
            try {
                switch (opcao) {
                    case 1:
                        listarContas();
                        break;
                    case 2:
                        abrirConta();
                        break;
                    case 3:
                        encerrarConta();
                        break;
                    case 4:
                        consultarSaldo();
                        break;
                    case 5:
                        realizarSaque();
                        break;
                    case 6:
                        realizarDeposito();
                        break;
                }
            } catch (RegraDeNegocioException e) {
                System.out.println("Erro: " +e.getMessage());
                System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu");
                teclado.next();
            }
            opcao = exibirMenu();
        }

        System.out.println("Finalizando a aplicação.");
    }

    private static int exibirMenu() {
        System.out.println("""
                BYTEBANK - ESCOLHA UMA OPÇÃO:
                1 - Listar contas abertas
                2 - Abertura de conta
                3 - Encerramento de conta
                4 - Consultar saldo de uma conta
                5 - Realizar saque em uma conta
                6 - Realizar depósito em uma conta
                7 - Sair
                """);
        return teclado.nextInt();
    }

    private static void listarContas() {
        System.out.println("Contas cadastradas:");
        var contas = service.listarContasAbertas();
        contas.stream().forEach(System.out::println);

        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }
 private static void abrirConta() {
        System.out.println("Digite o número da conta:");
        var numeroDaConta = teclado.nextInt();

        System.out.println("Digite o nome do cliente:");
        var nome = teclado.next();

        System.out.println("Digite o cpf do cliente:");
        var cpf = teclado.next();

        System.out.println("Digite o email do cliente:");
        var email = teclado.next();

        service.abrir(new DadosAberturaConta(numeroDaConta, new DadosCadastroCliente(nome, cpf, email)));

        System.out.println("Conta aberta com sucesso!");
        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }

    private static void encerrarConta() {
        System.out.println("Digite o número da conta:");
        var numeroDaConta = teclado.nextInt();

        service.encerrar(numeroDaConta);

        System.out.println("Conta encerrada com sucesso!");
        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }

    private static void consultarSaldo() {
        System.out.println("Digite o número da conta:");
        var numeroDaConta = teclado.nextInt();
        var saldo = service.consultarSaldo(numeroDaConta);
        System.out.println("Saldo da conta: " +saldo);

        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }

    private static void realizarSaque() {
        System.out.println("Digite o número da conta:");
        var numeroDaConta = teclado.nextInt();

        System.out.println("Digite o valor do saque:");
        var valor = teclado.nextBigDecimal();

        service.realizarSaque(numeroDaConta, valor);
        System.out.println("Saque realizado com sucesso!");
        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }

    private static void realizarDeposito() {
        System.out.println("Digite o número da conta:");
        var numeroDaConta = teclado.nextInt();

        System.out.println("Digite o valor do depósito:");
        var valor = teclado.nextBigDecimal();

        service.realizarDeposito(numeroDaConta, valor);

        System.out.println("Depósito realizado com sucesso!");
        System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
        teclado.next();
    }
}

Estou com o mesmo problema.

Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Unknown Source) at java.base/java.util.Scanner.next(Unknown Source) at java.base/java.util.Scanner.nextInt(Unknown Source) at java.base/java.util.Scanner.nextInt(Unknown Source) at br.com.alura.bytebank.BytebankApplication.exibirMenu(BytebankApplication.java:61) at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:16)PS D:\Users\Souza\Desktop\Curso\java jdbc 2\byte-bank-alura-curso_jdbc_inicio>

Que estranho, o erro InputMismatchException, ocorre quando você tenta passar uma string quando está esperando um int, por exemplo.

Esse erro permaneceu mesmo tentando selecionar outras opções do menu?

Acho que consegui resolver, parece q o terminal por algum motivo está enviando uns caracteres escondidos, com ajuda de um amigo modifiquei a classe e resolveu.

package br.com.alura.bytebank;

import br.com.alura.bytebank.domain.RegraDeNegocioException; import br.com.alura.bytebank.domain.cliente.DadosCadastroCliente; import br.com.alura.bytebank.domain.conta.ContaService; import br.com.alura.bytebank.domain.conta.DadosAberturaConta;

import java.util.Scanner;

public class BytebankApplication {

private static ContaService service = new ContaService();
private static Scanner teclado = new Scanner(System.in).useDelimiter("\n");

public static void main(String[] args) {
    var opcaoString = exibirMenu();
    int opcaoNumero = Integer.parseInt(opcaoString);
    while (opcaoNumero != 7) {
        try {
            switch (opcaoNumero) {
                case 1:
                    listarContas();
                    break;
                case 2:
                    abrirConta();
                    break;
                case 3:
                    encerrarConta();
                    break;
                case 4:
                    consultarSaldo();
                    break;
                case 5:
                    realizarSaque();
                    break;
                case 6:
                    realizarDeposito();
                    break;
            }
        } catch (RegraDeNegocioException e) {
            System.out.println("Erro: " +e.getMessage());
            System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu");
            teclado.next();
        }
        opcaoNumero = Integer.parseInt(exibirMenu());
    }

    System.out.println("Finalizando a aplicação.");
}

private static String exibirMenu() {
    System.out.println("""
            BYTEBANK - ESCOLHA UMA OPÇÃO:
            1 - Listar contas abertas
            2 - Abertura de conta
            3 - Encerramento de conta
            4 - Consultar saldo de uma conta
            5 - Realizar saque em uma conta
            6 - Realizar depósito em uma conta
            7 - Sair
            """);
    return teclado.next().replaceAll("[^\\d]", "");
}

private static void listarContas() {
    System.out.println("Contas cadastradas:");
    var contas = service.listarContasAbertas();
    contas.stream().forEach(System.out::println);

    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

private static void abrirConta() {
    System.out.println("Digite o número da conta:");
    String numeroDaConta = teclado.next().replaceAll("[^\\d]", "");

    System.out.println("Digite o nome do cliente:");
    var nome = teclado.next();

    System.out.println("Digite o cpf do cliente:");
    var cpf = teclado.next().replaceAll("[^\\d]", "");

    System.out.println("Digite o email do cliente:");
    var email = teclado.next();

    service.abrir(new DadosAberturaConta(Integer.parseInt(numeroDaConta), new DadosCadastroCliente(nome, cpf, email)));

    System.out.println("Conta aberta com sucesso!");
    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

private static void encerrarConta() {
    System.out.println("Digite o número da conta:");
    var numeroDaConta = teclado.nextInt();

    service.encerrar(numeroDaConta);

    System.out.println("Conta encerrada com sucesso!");
    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

private static void consultarSaldo() {
    System.out.println("Digite o número da conta:");
    var numeroDaConta = teclado.nextInt();
    var saldo = service.consultarSaldo(numeroDaConta);
    System.out.println("Saldo da conta: " +saldo);

    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

private static void realizarSaque() {
    System.out.println("Digite o número da conta:");
    var numeroDaConta = teclado.nextInt();

    System.out.println("Digite o valor do saque:");
    var valor = teclado.nextBigDecimal();

    service.realizarSaque(numeroDaConta, valor);
    System.out.println("Saque realizado com sucesso!");
    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

private static void realizarDeposito() { System.out.println("Digite o número da conta:"); var numeroDaConta = teclado.nextInt();

    System.out.println("Digite o valor do depósito:");
    var valor = teclado.nextBigDecimal();

    service.realizarDeposito(numeroDaConta, valor);

    System.out.println("Depósito realizado com sucesso!");
    System.out.println("Pressione qualquer tecla e de ENTER para voltar ao menu principal");
    teclado.next();
}

}

Ah perfeito, obrigado pela contribuição, Cleyton :)

Bons estudoss!

Olá Também passei pelo mesmo problema, e consegui resolver removendo o "useDelimiter("\n")" do scanner que foi instanciado na classe "ByteBankApplication", ou seja, é só instanciar um objeto Scanner padrão.

Como estava: private static Scanner teclado = new Scanner(System.in).useDelimiter("\n");

Resolvido: private static Scanner teclado = new Scanner(System.in);

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software