Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Lançada Exceção em caso de descrição de cargo com mais de uma palavra

Ao realizar testes no programa conforme ditado pelo professor, sempre que tento alterar um cargo colocando um nome com mais de uma palavra ("Diretor executivo", p.ex.) é lançada uma exceção "java.lang.IllegalStateException: Failed to execute CommandLineRunner" (ver print da console abaixo). Percebo que o método scanner.next() devolveu apena a primeira palavra (Diretor - veja pela mensagem que imprimi na console), e a partir daí o programa se perde. Também percebi que na aula o professor ao digitar a descrição "RECURSO_HUMANO" preencheu com underscore em vez de espaço. Como evitar esta exceção?

(mensagens omitidas)

2021-03-09 18:08:58.034  INFO 9680 --- [           main] b.c.s.spring.data.SpringDataApplication  : Started SpringDataApplication in 3.851 seconds (JVM running for 4.58)
Escolha a ação
0 - Sair
1 - Cargo
1
Escolha a opção:
0 - Voltar
1 - Criar cargo
2 - Alterar cargo
2
Entre o Id do cargo
8
Entre a nova descrição
Diretor executivo

Cargo digitado: id = 8 descrição = Diretor
Cargo instanciado: Cargo [id=8, descricao=Diretor]
Cargo atualizado
Escolha a opção:
0 - Voltar
1 - Criar cargo
2 - Alterar cargo
2021-03-09 18:09:18.642  INFO 9680 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-03-09 18:09:18.668 ERROR 9680 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:807) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:788) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3]
    at br.com.semasantos.spring.data.SpringDataApplication.main(SpringDataApplication.java:26) ~[classes/:na]
Caused by: java.util.InputMismatchException: null
    at java.base/java.util.Scanner.throwFor(Scanner.java:939) ~[na:na]
    at java.base/java.util.Scanner.next(Scanner.java:1594) ~[na:na]
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258) ~[na:na]
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212) ~[na:na]
    at br.com.semasantos.spring.data.service.CrudCargoService.inicial(CrudCargoService.java:31) ~[classes/:na]
    at br.com.semasantos.spring.data.SpringDataApplication.run(SpringDataApplication.java:41) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804) ~[spring-boot-2.4.3.jar:2.4.3]
    ... 5 common frames omitted
6 respostas

Oi Sérgio

Envia seu código aqui, por favor. Principalmente da CrudCargoService linha 31 que é onde está dando InputMismatchException

Oi, Otávio, obrigado pelo retorno. Segue abaixo a CrudCargoService. Talvez fosse o caso de perguntar ao professor por que ele preencheu RECURSO_HUMANO com undersore em vez de espaço, talvez tenha tido o mesmo problema.

package br.com.semasantos.spring.data.service; import java.util.Scanner; import org.springframework.stereotype.Service; import br.com.semasantos.spring.data.orm.Cargo; import br.com.semasantos.spring.data.repository.CargoRepository;

@Service public class CrudCargoService {

private final CargoRepository cargoRepository;

private Boolean continua = true;

public CrudCargoService (CargoRepository cargoRepository) {
    this.cargoRepository = cargoRepository;
}

public void inicial(Scanner scanner) {

    while (continua) {
        System.out.println("Escolha a opção:");
        System.out.println("0 - Voltar");
        System.out.println("1 - Criar cargo");
        System.out.println("2 - Alterar cargo");

// System.out.println("3 - Listar cargo"); // System.out.println("4 - Apagar cargo");

// Esta é a linha 31

        int opcao = scanner.nextInt();
        switch (opcao) {
        case 1:
            criar(scanner);
            break;
        case 2:
            alterar(scanner);
            break;

        default:
            continua = false;
            break;
        }
    }
}



private void alterar(Scanner scanner) {
    System.out.println("Entre o Id do cargo");
    int id = scanner.nextInt();
    System.out.println("Entre a nova descrição");
    String descricao = scanner.next();
    System.out.println("\nCargo digitado: id = " + id + " descrição = " + descricao);

    Cargo cargo =  new Cargo(descricao);
    cargo.setId(id);
    System.out.println("Cargo instanciado: " + cargo);
    cargoRepository.save(cargo);
    System.out.println("Cargo atualizado");
}

private void criar(Scanner scanner) {
    System.out.println("Entre a descrição do cargo");
    String descricao = scanner.next();

    Cargo cargo = new Cargo(descricao);
    cargoRepository.save(cargo);
    System.out.println("Cargo criado");
}

}

É. Aconteceu o mesmo comigo.

Oi Sergio

Vamos fazer uma alteração lá na classe CrudCargoService, vamos adicionar a linha scanner.useDelimiter("\n");

Exemplo:

    private void salvar(Scanner scanner) {
        System.out.println("Descricao do cargo");
        scanner.useDelimiter("\n");
        String descricao = scanner.next();
        Cargo cargo = new Cargo();
        cargo.setDescricao(descricao);
        cargoRepository.save(cargo);
        System.out.println("Salvo");
    }

Conte-me se resolveu o problema

Abraço

solução!

Oi, Otávio, mais uma vez obrigado pelo retorno. Mas também não funcionou, veja a saída na console abaixo. O que ocorre, aparentemente, é que ao executar o scanner.next() depois da configuração do delimiter("\n"), ele devolve uma string vazia, e na sequência perde o sincronismo das entradas. É o mesmo que ocorre quando tentei usar scanner.nextLine(), que pela documentação deveria resolver o problema. No entanto, pesquisando nos blogs, achei no GUJ algumas discussões de pessoas que esbarraram no mesmo problema, e acabaram por resolver repetindo o comando scanner.nextLine(). Experimentei o mesmo na solução apresentado por você, e também funcionou. Funciona, mas pra mim tem cheiro de gambiarra, nada elegante. Veja depois da console o código que eu usei a partir do seu, bem como a alternativa comentada com nextLine(), que deram certo.

2021-03-15 10:19:14.766 INFO 14060 --- [ main] b.c.s.spring.data.SpringDataApplication : Started SpringDataApplication in 4.245 seconds (JVM running for 4.894) Escolha a ação 0 - Sair 1 - Gerenciar cargos 2 - Gerenciar unidades de trabalho 3 - Gerenciar funcionários 1

Escolha a opção: 0 - Voltar 1 - Criar cargo 2 - Alterar cargo 3 - Listar cargos 4 - Apagar cargo 1 Entre a descrição do cargo Cargo criado: Cargo 6,

Cargos existentes: Cargo 1, Diretor executivo Cargo 2, Gerente técnico Cargo 6,

Escolha a opção: 0 - Voltar 1 - Criar cargo 2 - Alterar cargo 3 - Listar cargos 4 - Apagar cargo 3 2021-03-15 10:19:35.253 INFO 14060 --- [ main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2021-03-15 10:19:35.281 ERROR 14060 --- [ main] o.s.boot.SpringApplication : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:807) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:788) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:333) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) ~[spring-boot-2.4.3.jar:2.4.3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.4.3.jar:2.4.3] at br.com.semasantos.spring.data.SpringDataApplication.main(SpringDataApplication.java:32) ~[classes/:na] Caused by: java.util.InputMismatchException: null at java.base/java.util.Scanner.throwFor(Scanner.java:939) ~[na:na] at java.base/java.util.Scanner.next(Scanner.java:1594) ~[na:na] at java.base/java.util.Scanner.nextInt(Scanner.java:2258) ~[na:na] at java.base/java.util.Scanner.nextInt(Scanner.java:2212) ~[na:na] at br.com.semasantos.spring.data.service.CrudCargoService.inicial(CrudCargoService.java:33) ~[classes/:na] at br.com.semasantos.spring.data.SpringDataApplication.run(SpringDataApplication.java:51) ~[classes/:na] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804) ~[spring-boot-2.4.3.jar:2.4.3] ... 5 common frames omitted

2021-03-15 10:19:35.285 INFO 14060 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2021-03-15 10:19:35.287 INFO 14060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2021-03-15 10:19:35.295 INFO 14060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

private void criar(Scanner scanner) { System.out.println("Entre a descrição do cargo"); // scanner.nextLine(); // String descricao = scanner.nextLine(); scanner.useDelimiter("\n"); scanner.next(); String descricao = scanner.next(); Cargo cargo = new Cargo(descricao); Cargo novoCargo = cargoRepository.save(cargo); System.out.println("Cargo criado: " + novoCargo); listar(); }

Olá pessoal, Não sei se é a melhor solução, mas para mim funcionou dando new no Scanner no começo do código:

    private void salvar(Scanner scanner) {
        scanner = new Scanner(System.in);
        System.out.println("Descrição do cargo");
        String descricao = scanner.nextLine();
        Cargo cargo = new Cargo();
        cargo.setDescricao(descricao);
        cargoRepository.save(cargo);
        System.out.println("Salvo");
    }