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

Exceçoes

boa noite sobre Exceçoes como posso estudar-las saber qual usar na hora serta vi a documentaçao mas la so mostra qundo vc ja sabe o que esta procurando mas eu estou estudando nao sei qual usar que horas so a generica

6 respostas

Oi, boa noite! Acho que primeiro a gente teria que pensar porque o tratamento de exceções existe no Java. Pense nele como um mecanismo que permite lidar com erros e condições inesperadas, que pode acontecer na sua aplicação, para que o fluxo do seu programa não interrompa de repente e deixe o usuário a ver navios. O ideal é que você trate a exceção dentro do catch(), ou seja, resolva o problema que aconteceu, de alguma forma. Mas se não for possível, ela também existe para, ao menos, mostrar informações mais detalhadas sobre o erro que ocorreu para que o usuário/desenvolvedor tenha o máximo de informações possiveis para corrigir o problema direto no código.

Aqui um exemplo de um tratamento de exceções onde o problema é resolvido:

Neste exemplo, vamos tentar ler um arquivo. Se o arquivo não for encontrado, criaremos um novo arquivo.

import java.io.*;

public class ExemploTratamentoResolvido {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("arquivo.txt"));
System.out.println("Arquivo lido com sucesso.");
} catch (FileNotFoundException e) {
System.out.println("Arquivo não encontrado. Criando um novo arquivo...");
try {
BufferedWriter writer = new BufferedWriter(new FileWriter("arquivo.txt"));
writer.write("Conteúdo inicial do arquivo.");
writer.close();
System.out.println("Novo arquivo criado com sucesso.");
} catch (IOException ioException) {
System.out.println("Erro ao criar o arquivo: " + ioException.getMessage());
}
} catch (IOException e) {
System.out.println("Erro de leitura/escrita: " + e.getMessage());
}
}
}

No exemplo acima, a aplicação tenta ler um arquivo, mas ele não existe, então a aplicação cria um arquivo e pronto, problema resolvido(claro que isso vai depender das regras de negócio da sua aplicação, mas esse foi somente um exemplo para ilustrar melhor).

Aqui um tratamento de exceções onde o problema não é resolvido, mas pelo menos ele informa o usuário sobre o problema que ocorreu:

import java.sql.*;

public class ExemploTratamentoInformativo {
public static void main(String[] args) {
try {
Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost:3306/meuBanco", "usuario", "senha");
System.out.println("Conexão estabelecida com sucesso.");
} catch (SQLException e) {
System.out.println("Não foi possível conectar ao banco de dados.");
System.out.println("Detalhes do erro: " + e.getMessage());
System.out.println("Por favor, verifique suas credenciais e a conexão de rede.");
}
}
}

O ideal é que sempre que você escrever um código onde pode brotar uma exceção, então você envolva ele em um try/catch para essa exceção, se ocorrer, ser tratada da melhor forma possível. Com o tempo, você vai sacando onde pode surgir exceptions, mas aqui uma lista de situações onde costumam ocorrer:

  • Operações de entrada e saída
  • Validação de dados
  • Operações matemáticas
  • Acesso a recursos externos como API's, etc

Existe também situações onde o tratamento de exceptions é usado para liberação de recursos. Exemplo: Usar o try/catch/finally para garantir que arquivos ou recursos que um banco de dados usa sejam fechados corretamente.

try {
// Código que pode lançar exceção
} catch (Exception e) {
// Tratamento da exceção
} finally {
// Código de limpeza, como fechar arquivos ou conexões
}

Aqui finally sempre é executado, independente se ocorreu ou não uma exception(há situações onde isso é muito proveitoso de se usar).

E por último, recomendo você estudar a diferença entre Checked Exceptions e Unchecked Exceptions.

nao foi o que eu perguntei sei com usar a exceçao mas so uso as que eu ja conheço a pergunta e como saber quais usar e quando nao como usar mas obrigado pela tentativa

Oi, boa tarde! Tudo bem? Acho que então a pergunta seria: quando eu devo saber quais exceções eu vou tratar em determinado trecho de código? Porque eu não entendo essa expressão "quais exceções usar", porque você não usa exceção e sim lança elas ou trata elas. Se for nesse sentido a sua pergunta, então você deve verificar quais exceções um método pode lançar. Pra isso é só segurar CTRL e clicar em cima do método. Exemplo:

try {
            response = client.send(request, HttpResponse.BodyHandlers.ofString());
        } catch (IOException e) {
            throw new RuntimeException("A requisição HTTP falhou", e);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("A thread foi interrompida durante a request HTTP", e);
        }

Se você entrar no método send() segurando CTRL e clicando nele, você vai ver que ele pode lançar duas exceptions:

public abstract <T> HttpResponse<T>
    send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
        throws IOException, InterruptedException;

Então, a partir daí você vai saber quais exceções esse método pode lançar e se antecipar e tratar elas.

ata entao cada método tem sua exceção e si eu criar um metodo e a mesma coisa

solução!

Exatamente! Vamos supor que você está criando um método para dividir 2 valores:

class Calculadora {
dividir(a, b) {
if (b === 0) {
throw new Error('Divisão por zero não é permitida.');
}
return a / b;
}
}

No método dividir(), que você criou, você está lançando uma exception Error()(pois não se pode dividir o dividendo por 0), então quem for usar esse método, pode tratar essa exceção que você está lançando:

const calc = new Calculadora();
try {
console.log(calc.dividir(10, 2)); //  5
console.log(calc.dividir(10, 0)); // Lança a exception
} catch (error) {
console.error(error.message); //  Divisão por zero não é permitida
}

muinto bom obrigado