Excesso de try catch

Gostaria que reparassem na quantidade de tratamento de exceção. qualquer input INT que eu declarar fica sujeito a um erro casso passem uma string pra ele é má pratica usar muitos try catch? deixa o programa mais lento? ou não! posso usar a vontade para desviar dos erros e continuar o programa?
Random aleatorioID = new Random();
final int MAXID = 1000;

    while (true) {
        produto p = new produto();
        System.out.println("Nome: ");
        String nome = in.next().trim();
        p.setNome(nome);

        int tipo = 0;
        String stringTipo = null;
        while (true) {
            System.out.println("\tTipo\n1 MASSA\n2 BEBIDA\n3 LIMPEZA\n>> ");

            try {
                stringTipo = in.next();
                tipo = Integer.parseInt(stringTipo);
                if (tipo > 0 && tipo <= 3) {
                    break;
                }
                System.out.println("voce digitou \"" + stringTipo + "\" invalido");
            } catch (NumberFormatException ex) {
                System.out.println("voce digitou o caractere \"" + stringTipo + "\" é invalido");
            }

        }
        switch (tipo) {
            case 1: {
                p.setTipo(TIPOS.MASSA.getTipo());
                break;
            }
            case 2: {
                p.setTipo(TIPOS.BEBIDA.getTipo());
                break;
            }
            case 3: {
                p.setTipo(TIPOS.LIMPEZA.getTipo());
                break;
            }
        }

        float preco = 0;
        String precoString = null;
        while (true) {
            System.out.print("Preço: ");
            try {
                precoString = in.next();
                preco = Float.parseFloat(precoString);
                p.setPreco(preco);
                break;
            } catch (NumberFormatException ex) {
                System.out.println("voce digitou \"" + precoString + "\" nao é valido");
            }
        }

        int idEscolhido = 0;
        while (true) {
            idEscolhido = aleatorioID.nextInt(MAXID);
            if (!id.contains(idEscolhido)) {;
                break;
            }
            System.out.println("ID já existente");
        }
        id.add(idEscolhido);
        p.setID(idEscolhido);
        escreverIDs(String.valueOf(idEscolhido));

        int quant = 0;
        String stringQuant = null;
        while (true) {
            System.out.println("Quantidade: ");
            try {
                stringQuant = in.next();
                quant = Integer.parseInt(stringQuant);
                p.setQuantidade(quant);
                break;
            } catch (NumberFormatException ex) {
                System.out.println("voce digitou \"" + stringQuant + "\" nao é valido");
            }
        }
        adicionarProduto.addProduto(p);
        char continuar = in.next().charAt(0);
        if (continuar == 'n' || continuar == 'n') {
            this.ReescreverMudanças();
            break;
        }
    }
}

private void escreverIDs(String idEscolhido) {
    try {
        attIDS.setReadOnly(false);
        BufferedWriter escreverID = new BufferedWriter(new FileWriter(caminhoArqIDs.toFile(), true));
        escreverID.write(idEscolhido + "\r\n");
        escreverID.flush();
        escreverID.close();
        attIDS.setReadOnly(true);
    } catch (IOException ex) {
        System.out.println("erro ao escrever arquivo IDs");
    }
}

private void ReescreverMudanças() {
    try {
        att.setReadOnly(false);
        BufferedWriter escrever = new BufferedWriter(new FileWriter(caminhoCompleto.toFile(), true));
        adicionarProduto.produtos.forEach(action -> {
            try {
                escrever.write(action.getTipo() + " ");
                escrever.write(action.getNome() + " ");
                escrever.write(action.getID() + " ");
                escrever.write(action.getQuantidade() + " ");
                escrever.write(action.getPreco() + "\r\r\n");
            } catch (IOException ex) {
                System.out.println("erro ao escrever as informaçoes de produtos no arquivo Registros.txt");
            }
        });
        escrever.flush();
        escrever.close();
        att.setReadOnly(true);
    } catch (IOException ex) {
        System.out.println("erro ao abrir o arquivo Registros.txt para escrita");
    }
}

Desde que o java 7 trouxe o try com multi catch, você pode sintetizar tudo isso em um único bloco try/catch

try {
    //Qualquer código aqui
} catch (FileNotFoundException | ClassNotFoundException | NumberFormatException | ParseException ex) {
    //Trata a exceção adequadamente
}

se o código for colocado dentro de um try catch e for EX: digite seu nome digite sua idade digite seu CPF etc… e colocado um CPF invalido vou ter que começar do inicio(digite seu nome) acho que o jeito é usar varios trys e catchs :thinking:

Não, você pode colocar um while que pegue somente o CPF, e enquanto a validação não for feita de maneira correta ele pede o CPF da pessoa, não há necessidade de se repetir todo o cadastro

To vendo que você está tentando lançar exceptions para entradas inválidas, porque você não colocar uma mascara no input para aceitar apenas os caracteres que você espera, isso diminui a quantidade de try catch, porque deixar entrar como uma string em um input de números?

1 curtida

mascara no input? me da um exemplo tipo pedir o usuário que digite tal palavra?

olha pelo oque eu entendi você está verificando se está vindo um número ou uma string, ou uma string que pode ser convertida para um número(NumberFormatException), certo?

se for isso uma máscara resolveria teu excesso de try catch.
voce poderia configurar para seu campo so aceitar números, ou qualquer outro formato que vc queira, igual aquelas cadastros de formulários na internet, tipo cpf, que so pode colocar números sabe? tem uns que ja vem com os pontos e traços nos campos, isso ai se chama máscara de campo, pesquise sobre isso, se tiver usando java swing é muito fácil de fazer

1 curtida