Ir ao conteúdo
  • Cadastre-se

Java Aprendendo Exceções em Java


lsnkesp
Ir à solução Resolvido por AdrianoSiqueira,

Posts recomendados

Gente alguém pode me ajudar? Tô estudando exceções e to confusa.

Tô lançando uma exceção toda vez que é digitado no campo senha (que é um int) uma string

Quero lançar uma exceção para caso seja digitado uma senha com algum caractere, mas não tô sabendo como fazer.

Este é o código de execução (main):

case "c" -> {
                    try {
                        System.out.println("Nome, CPF, Salário e Senha");   
                        control.cadastrarDiretor(y.nextLine(), y.nextLine(), y.nextDouble(), y.nextInt());
                    } catch(Exception e) {
                        System.out.println(e.getMessage());
                    }
                    y.nextLine();
                }

Está lançando da maneira correta, o problema é que eu queria lançar no método de cadastro de diretor, para assim poder tratá-la no main.

(Este metodo ehInteiro(); serve para verificar se o que foi digitado no atributo senha é um inteiro, caso não seja, lançaria a exceção).

public void cadastrarDiretor(String nome, String cpf, double salario, int senha) {
        if(ehInteiro(Integer.toString(senha))) {
            f = new Diretor(nome, cpf, salario, senha);
            mapaAut.put(cpf, (Autentica) f);
        } else {
            throw new InputMismatchException("Ocorreu um erro.");
        }
    }

A mensagem exibida na verdade é "null" e não "Ocorreu um erro", e eu não estou conseguindo entender porque.

Se alguém puder me ajudar sendo respeitoso, ficarei grata (Ainda estou com bastante dificuldade nessa parte).

Link para o comentário
Compartilhar em outros sites

Faltou especificar as exceções que o método pode "jogar" (throws):

public void cadastrarDiretor(String nome, String cpf, double salario, int senha) throws InputMismatchException {
        if(ehInteiro(Integer.toString(senha))) {
            f = new Diretor(nome, cpf, salario, senha);
            mapaAut.put(cpf, (Autentica) f);
        } else {
            throw new InputMismatchException("Ocorreu um erro.");
        }
    }
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza Continua retornando null.

 

Meu método está assim:

public void cadastrarDiretor(String nome, String cpf, double salario, int senha) throws InputMismatchException {
        if (ehInteiro(Integer.toString(senha)) == true) {
            f = new Diretor(nome, cpf, salario, senha);
            mapaAut.put(cpf, (Autentica) f);
        } else {
            throw new InputMismatchException("Ocorreu um erro.");
        }
    }

Main:

case "c" -> {
                    System.out.println("Nome, CPF, Salário e Senha");
                    try {
                        control.cadastrarDiretor(y.nextLine(), y.nextLine(), y.nextDouble(), y.nextInt());
                    } catch (InputMismatchException e) {
                        System.out.println(e.getMessage());
                    }
                    y.nextLine();
                }

Execução (Caso eu digite um caractere ao invés de um inteiro na entrada do valor "Senha".

Citação

c (escolhi a opção c)
Nome, CPF, Salário e Senha
testando
1232
2000
a (digitei um caractere)
null (e.getMessage() retorna null)

 

Link para o comentário
Compartilhar em outros sites

10 horas atrás, lsnkesp disse:

@Flávio Pedroza Continua retornando null.

 

Meu método está assim:

public void cadastrarDiretor(String nome, String cpf, double salario, int senha) throws InputMismatchException {
        if (ehInteiro(Integer.toString(senha)) == true) {
            f = new Diretor(nome, cpf, salario, senha);
            mapaAut.put(cpf, (Autentica) f);
        } else {
            throw new InputMismatchException("Ocorreu um erro.");
        }
    }

Main:

case "c" -> {
                    System.out.println("Nome, CPF, Salário e Senha");
                    try {
                        control.cadastrarDiretor(y.nextLine(), y.nextLine(), y.nextDouble(), y.nextInt());
                    } catch (InputMismatchException e) {
                        System.out.println(e.getMessage());
                    }
                    y.nextLine();
                }

Execução (Caso eu digite um caractere ao invés de um inteiro na entrada do valor "Senha".

 

Eu consegui resolver fazendo conversão de senha pra String, caso seja identificado algum caractere na minha senha, lança a exceção e assim consigo trata-la no main.

De qualquer forma, ainda gostaria de saber o que rolou, porque realmente não ta funcionando utilizando int. 😕

Link para o comentário
Compartilhar em outros sites

  • Solução

Veja se isso ajuda:

public class Main {

    public static void main(String[] args) {
        try {
//            cadastrarDiretor("A", "123", "123", "123");
            cadastrarDiretor("A", "123", "12A", "123");
//            cadastrarDiretor("A", "123", "123", "12A");
        } catch (IllegalArgumentException e) {
            System.out.println("O método lançou exceção com a seguinte mensagem: '" + e.getMessage() + "'");
        }
    }


    private static void cadastrarDiretor(String nome, String cpf, String salario, String senha)
    throws IllegalArgumentException {
        String regex = "\\d+";

        if (!salario.matches(regex)) {
            throw new IllegalArgumentException("O salário não é válido.");
        } else if (!senha.matches(regex)) {
            throw new IllegalStateException("A senha deve conter apenas números");
        }

        System.out.println("Criando o diretor...");
    }
}

 

No meu exemplo, o método cadastrarDiretor recebe todos os parâmetros em formato de String para representar a realidade. Se esses dados vierem de uma interface gráfica, provavelmente serão Strings.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@AdrianoSiqueira Sim, percebi que se torna 1231266x mais fácil trabalhar com string nesses casos.

Eu consegui resolver assim:

Main:
case "c" -> {
                    System.out.println("Salário, Nome, CPF e Senha");
                    String salarioDiretor = y.nextLine();
                    Double salario;
                    try {
                        salario = Double.parseDouble(salarioDiretor);
                        String nome = y.nextLine();
                        String cpf = y.nextLine();
                        y.nextLine();
                        String senha = y.nextLine();
                        System.out.println(control.cadastrarDiretor(nome, cpf, salario, senha));
                    } catch (NumberFormatException e) {
                        System.out.println("ERRO: " + e.getMessage() + ": Não foi possível cadastrar o diretor.");
                    }
                }
Controller:
public String cadastrarDiretor(String nome, String cpf, double salario, String senha) throws NumberFormatException {
        String teste = senha;
        if (verificacao(teste)) {
            f = new Diretor(nome, cpf, salario, Integer.parseInt(senha));
            mapaAut.put(cpf, (Autentica) f);
            return "Diretor " + nome + " cadastrado.";
        } else {
            throw new NumberFormatException("Senha possui caractere, precisa ser inteiro. Tente novamente.");
        }
    }

public boolean verificacao(String senha) {
        char[] v = senha.toCharArray();
        for (int i = 0; i < v.length; i++) {
            if (!Character.isDigit(v[i])) {
                return false;
            }
        }
        return true;
    }

Enfim, foi a única forma mais fácil que encontrei de resolver o problema que retorna "null" no e.getMessage().

Inclusive, obrigada, também vou utilizar a sua maneira como base para resoluções futuras.

Só mais uma coisa, você pode me dizer como vai funcionar esse matches()? Nunca havia utilizado.

Link para o comentário
Compartilhar em outros sites

Tem a ver com expressões regulares. É assunto complexo demais para explicar com texto, vou deixar umas vídeo aulas para você.

  1. Aula 1
  2. Aula 2
  3. Aula 3
  4. Aula 4
  5. Aula 5
  6. Aula 6

Essas aulas fazem parte de um curso, recomendo que você faça. O curso se chama "Maratona Java Virado no Jiraya" do canal "DevDojo". O nome é duvidoso, mas o conteúdo é incrível. E de graça.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

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