DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 72: Priorize o uso das exceções padrões

1. Importância da reutilização de exceções padrão

  • Exceções padrão tornam o código mais fácil de entender e familiar para outros programadores.
  • Melhoram a leitura e o aprendizado da API.
  • Reduzem o consumo de memória e o tempo de carregamento de classes.

2. Exceções padrão mais reutilizadas e seus usos típicos

  • IllegalArgumentException:
  • Usada quando um parâmetro possui um valor inadequado.

Exemplo:

public void setRepeatCount(int count) {
    if (count < 0) {
        throw new IllegalArgumentException("Count cannot be negative");
    }
    this.count = count;
}

Enter fullscreen mode Exit fullscreen mode

IllegalStateException:

  • Lançada quando o estado do objeto não permite a operação.

Exemplo:

public void start() {
    if (started) {
        throw new IllegalStateException("Already started");
    }
    started = true;
}

Enter fullscreen mode Exit fullscreen mode

NullPointerException:

  • Usada quando um parâmetro nulo é proibido.

Exemplo:

public void setName(String name) {
    if (name == null) {
        throw new NullPointerException("Name cannot be null");
    }
    this.name = name;
}

Enter fullscreen mode Exit fullscreen mode

IndexOutOfBoundsException:
Usada para índices fora do intervalo permitido.

Exemplo:

public int getElement(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException("Index out of range");
    }
    return elements[index];
}

Enter fullscreen mode Exit fullscreen mode

ConcurrentModificationException:

  • Lançada ao detectar uma modificação concorrente em objetos projetados para uso por uma única thread.

Exemplo:

for (String item : list) {
    list.remove(item); // Pode lançar ConcurrentModificationException
}

Enter fullscreen mode Exit fullscreen mode

UnsupportedOperationException:

  • Lançada quando uma operação não é suportada pelo objeto.

Exemplo:

List<String> immutableList = Collections.unmodifiableList(new ArrayList<>());
immutableList.add("item"); // Lança UnsupportedOperationException

Enter fullscreen mode Exit fullscreen mode

3. Boas práticas ao usar exceções padrão

  • Não reutilize superclasses gerais como Exception, RuntimeException, Throwable ou Error diretamente.
  • Escolha a exceção com base em suas semânticas documentadas.
  • Use subclasses personalizadas de exceções padrão apenas quando necessário.

4. Decisão entre exceções

  • Em situações ambíguas, siga estas diretrizes:
  • Use IllegalStateException se a operação falhou devido ao estado do objeto.
  • Use IllegalArgumentException se a falha foi causada por um argumento inválido.

Exemplo:

  • Um método para distribuir cartas pode lançar IllegalArgumentException se o tamanho da mão for inválido ou IllegalStateException se o baralho não tiver cartas suficientes.

5. Outras exceções reutilizáveis

  • ArithmeticException e NumberFormatException podem ser usadas em contextos de operações matemáticas e conversões de números.

Exemplo:

public int divide(int numerator, int denominator) {
    if (denominator == 0) {
        throw new ArithmeticException("Division by zero");
    }
    return numerator / denominator;
}

Enter fullscreen mode Exit fullscreen mode

Image description

Conclusão
Priorize o uso de exceções padrão sempre que possível. Elas tornam o código mais claro, eficiente e consistente com as práticas da linguagem Java.

Top comments (1)

Collapse
 
igventurelli profile image
Igor Venturelli • Edited

Gostei bastante do item abordado e concordo em partes, mas na contramão, algumas ferramentas de SAST como sonarqube por exemplo, reclamam se você usar exceções nativas.