DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 74 - Documente todas as exceções lançadas por cada método

Importância:

  • A documentação das exceções lançadas é essencial para o uso correto de métodos.
  • Sem a documentação adequada, outros programadores podem ter dificuldade em utilizar suas classes ou interfaces.

Regras para documentação:

  • 1. Use a tag @throws no Javadoc:
  • Documente todas as exceções verificadas e não verificadas.
/**
 * Calcula a raiz quadrada de um número.
 *
 * @param value o número cuja raiz quadrada será calculada
 * @return a raiz quadrada do número
 * @throws IllegalArgumentException se o número for negativo
 */
public double calculateSquareRoot(double value) {
    if (value < 0) {
        throw new IllegalArgumentException("O número não pode ser negativo.");
    }
    return Math.sqrt(value);
}

Enter fullscreen mode Exit fullscreen mode

Declare exceções verificadas individualmente:

  • Inclua-as na cláusula throws e documente as condições em que são lançadas.
  • Não use superclasses genéricas como Exception ou Throwable.
/**
 * Lê dados de um arquivo.
 *
 * @param file o arquivo a ser lido
 * @return os dados lidos
 * @throws IOException se ocorrer um erro de I/O
 */
public String readFile(File file) throws IOException {
    // Implementação...
}

Enter fullscreen mode Exit fullscreen mode

Documente exceções não verificadas:**

  • Mesmo que a linguagem não exija, descreva as exceções não verificadas para ajudar os programadores a evitarem erros.
/**
 * Divide dois números.
 *
 * @param numerator o numerador
 * @param denominator o denominador
 * @return o resultado da divisão
 * @throws ArithmeticException se o denominador for zero
 */
public int divide(int numerator, int denominator) {
    if (denominator == 0) {
        throw new ArithmeticException("Divisão por zero não é permitida.");
    }
    return numerator / denominator;
}

Enter fullscreen mode Exit fullscreen mode

Documentação em nível de classe:

  • Para exceções comuns, como NullPointerException, documente no nível da classe quando aplicável a vários métodos.
/**
 * Esta classe realiza operações matemáticas.
 * 
 * <p>Todos os métodos desta classe lançam uma {@code NullPointerException} se
 * algum parâmetro for {@code null}.</p>
 */
public class MathOperations {
    // Implementação...
}

Enter fullscreen mode Exit fullscreen mode

Exceções a essas regras:
Método main:

  • Pode declarar throws Exception, pois é chamado pela JVM
public static void main(String[] args) throws Exception {
    // Implementação...
}

Enter fullscreen mode Exit fullscreen mode

Revisões futuras:

  • Exceções não verificadas adicionadas após uma revisão não violam a compatibilidade, mas devem ser documentadas se possível.

Boas práticas:
Não declare exceções não verificadas em throws:

  • A ausência de throws para exceções não verificadas destaca visualmente que são não verificadas.
public void doSomething() {
    // Pode lançar uma NullPointerException, mas não a declaramos em "throws".
}

Enter fullscreen mode Exit fullscreen mode

Documente exceções não verificadas como precondições:

  • Descreva as condições necessárias para que o método funcione sem lançar exceções.

Evite classes genéricas em throws:

  • Declarações como throws Exception ou throws Throwable escondem detalhes importantes.

Evitar:

public void doSomething() throws Exception {
    // Não recomendado
}

Enter fullscreen mode Exit fullscreen mode

Resumo de implementação:
Use @throws para documentar todas as exceções:

/**
 * Processa uma lista de itens.
 *
 * @param items a lista de itens a ser processada
 * @throws NullPointerException se a lista for {@code null}
 * @throws IllegalArgumentException se a lista estiver vazia
 */
public void processItems(List<String> items) {
    if (items == null) {
        throw new NullPointerException("A lista não pode ser null.");
    }
    if (items.isEmpty()) {
        throw new IllegalArgumentException("A lista não pode estar vazia.");
    }
    // Processamento...
}

Enter fullscreen mode Exit fullscreen mode

Documente no nível da classe para exceções recorrentes:

/**
 * Classe responsável por operações em arquivos.
 *
 * <p>Todos os métodos desta classe lançam uma {@code NullPointerException}
 * se um arquivo {@code null} for passado.</p>
 */
public class FileOperations {
    // Métodos...
}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)