Java Exceções Comuns

Quando um programa Java quebra rodando, ele mostra uma exceção: o nome do problema, uma mensagem e a lista de onde aconteceu. Esta página reúne as exceções que você mais vai encontrar, cada uma com a mensagem real (todas provocadas de propósito num JDK 25), a causa e como evitar. Para entender o que é uma exceção e como tratá-la, veja O que são Exceções e try e catch.

Nesta página

Como ler uma exceção

$ java Main.java
Exception in thread "main" java.lang.NumberFormatException: For input string: "vinte"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	at java.base/java.lang.Integer.parseInt(Integer.java:565)
	at java.base/java.lang.Integer.parseInt(Integer.java:662)
	at Main.main(Main.java:3)
Exception in thread "main"
Uma exceção não tratada parou a thread principal (o seu main). O programa termina com código de saída 1.
java.lang.NumberFormatException
O tipo do problema, com o pacote na frente. É o nome que você procura na tabela abaixo.
For input string: "vinte"
A mensagem: o detalhe. Aqui, o texto que não virou número.
at java.base/…
Linhas de dentro do próprio Java. Quase sempre você pode pular.
at Main.main(Main.java:3)
A primeira linha do seu código, de cima para baixo: arquivo Main.java, linha 3. Comece por ela.

Essa lista de at … é o stack trace ("rastro da pilha"): quem chamou quem até o erro, do mais recente (em cima) para o mais antigo (embaixo).

Checked × unchecked

FamíliaExemplosO compilador obriga a tratar?Normalmente indica
RuntimeException e filhas (unchecked)NullPointerException, ArithmeticException, IndexOutOfBoundsExceptionNãoUm defeito no código: conserte o código.
Outras filhas de Exception (checked)IOException, NoSuchFileException, InterruptedExceptionSim: try/catch ou throwsAlgo externo que pode falhar (arquivo, rede): trate.
Error e filhasStackOverflowError, OutOfMemoryErrorNãoProblema grave da JVM; não se costuma capturar.

Detalhes em Checked × Unchecked.


As exceções comuns

Em cada linha, a mensagem é a primeira linha real da saída; a coluna "Linha do seu código" mostra a linha at que aponta para o programa de exemplo.

Números e contas

ExceçãoQuando aconteceMensagem realComo evitarAula
ArithmeticExceptionDivisão inteira por zero: total / pessoas com pessoas = 0.java.lang.ArithmeticException: / by zeroConfira o divisor antes (if (pessoas != 0)). Com double não há exceção: dá Infinity.Operadores Aritméticos
ArithmeticExceptionBigDecimal.divide com resultado infinito (10 ÷ 3).java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.Diga as casas e o arredondamento: divide(tres, 2, RoundingMode.HALF_EVEN).BigDecimal
ArithmeticExceptionMath.addExact/multiplyExact passou do limite do tipo.java.lang.ArithmeticException: integer overflowUse long ou BigInteger se os números podem crescer.Métodos de Math
NumberFormatExceptionConverter texto que não é número: Integer.parseInt("vinte").java.lang.NumberFormatException: For input string: "vinte"try/catch (NumberFormatException e) ou validar antes (texto.matches("-?\\d+")).Wrappers

Índices e tamanhos

ExceçãoQuando aconteceMensagem realComo evitarAula
ArrayIndexOutOfBoundsExceptionPosição inexistente num array: notas[3] com 3 notas (posições 0, 1, 2).java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3O último índice é length - 1. Em laços, i < notas.length (nunca <=), ou use for-each.Arrays
IndexOutOfBoundsExceptionPosição inexistente numa lista: frutas.get(3) num ArrayList de 3.java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3Confira i < lista.size(). Num List.of(…), a mesma situação dá ArrayIndexOutOfBoundsException.ArrayList
StringIndexOutOfBoundsExceptionPosição inexistente num texto: "Ana".charAt(5), ou substring com início maior que o fim.java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 3Confira contra length(); cuidado com indexOf que devolveu -1.Métodos de String
NegativeArraySizeExceptionCriar array com tamanho negativo.java.lang.NegativeArraySizeException: -1Valide o tamanho que veio da entrada ou de uma conta.Arrays
ArrayStoreExceptionGuardar um tipo errado num array visto como Object[]: caixas[0] = 42 num String[].java.lang.ArrayStoreException: java.lang.IntegerPrefira listas com generics (List<String>): o erro aparece na compilação.Generics

Objetos e tipos

ExceçãoQuando aconteceMensagem realComo evitarAula
NullPointerExceptionUsar (chamar método, ler atributo) uma variável que vale null.java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is nullInicialize as variáveis; confira if (x != null); use Optional para "pode não ter valor". Veja abaixo.O que são Exceções
ClassCastExceptionConverter (cast) um objeto para um tipo que ele não é: (Integer) "42".java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')Teste antes com instanceof (melhor: if (valor instanceof Integer n)).Pattern Matching
IllegalArgumentExceptionUm método recebeu um argumento inválido: sorteio.nextInt(0). Também é a exceção certa para os seus métodos recusarem argumentos.java.lang.IllegalArgumentException: bound must be positiveLeia a documentação do método; valide antes de chamar.throw e throws
IllegalStateExceptionO objeto não está em condições de fazer aquilo agora: ler de um Scanner já fechado.java.lang.IllegalStateException: Scanner closedRespeite a ordem de uso (não feche o Scanner(System.in) antes de terminar de ler).Scanner

Entrada do teclado

ExceçãoQuando aconteceMensagem realComo evitarAula
InputMismatchExceptionnextInt()/nextDouble() encontrou algo que não é número (ou, em pt_BR, 2.5 com ponto).java.util.InputMismatchException (sem mensagem)Pergunte antes com hasNextInt()/hasNextDouble(); veja o projeto da calculadora.Scanner
NoSuchElementExceptionPedir a próxima linha quando a entrada acabou (Ctrl+D, ou entrada vazia).java.util.NoSuchElementException: No line foundConfira com hasNextLine()/hasNext().Scanner

Coleções, Optional e iteradores

ExceçãoQuando aconteceMensagem realComo evitarAula
UnsupportedOperationExceptionAlterar uma coleção imutável: List.of("uva", "maçã").add("kiwi").java.lang.UnsupportedOperationException (sem mensagem)Para alterar, copie: new ArrayList<>(List.of(…)).Cola de Coleções
ConcurrentModificationExceptionRemover (ou adicionar) itens da lista dentro de um for-each sobre ela.java.util.ConcurrentModificationException (sem mensagem)lista.removeIf(n -> n % 2 == 0) ou um Iterator com it.remove().Iterator
NoSuchElementExceptionOptional.get() num Optional vazio (ex.: o max de uma lista vazia).java.util.NoSuchElementException: No value presentUse orElse(0), orElseThrow(…) ou ifPresent(…).Optional
NoSuchElementExceptionit.next() num iterador que já acabou.java.util.NoSuchElementException (sem mensagem)Chame next() só depois de hasNext() devolver true.Iterator

Arquivos, datas e textos

ExceçãoQuando aconteceMensagem realComo evitarAula
NoSuchFileException (checked, é uma IOException)Files.readString(Path.of("notas.txt")) e o arquivo não existe (na pasta de onde você rodou o java).java.nio.file.NoSuchFileException: notas.txtFiles.exists(caminho) antes, e try/catch (IOException e).Ler e Escrever Arquivos
FileNotFoundException (checked)O mesmo, com as classes antigas (FileReader, FileInputStream).java.io.FileNotFoundException: notas.txt (Arquivo ou diretório inexistente)Idem. A parte entre parênteses vem do sistema, no idioma dele.Ler e Escrever Arquivos
DateTimeParseExceptionLocalDate.parse("16/10/2026"): o parse sem formato espera 2026-10-16.java.time.format.DateTimeParseException: Text '16/10/2026' could not be parsed at index 0Passe o formato: LocalDate.parse(texto, DateTimeFormatter.ofPattern("dd/MM/yyyy")).Datas e Horas
DateTimeExceptionData impossível: LocalDate.of(2026, 2, 30).java.time.DateTimeException: Invalid date 'FEBRUARY 30'Valide dia e mês; capture a exceção se a data vem do usuário.Datas e Horas
PatternSyntaxExceptionExpressão regular mal escrita: Pattern.compile("(abc").java.util.regex.PatternSyntaxException: Unclosed group near index 4 (e a regex na linha seguinte)Feche parênteses e colchetes; para texto literal, Pattern.quote(…).Expressões Regulares

Missão: o programa lê uma idade como texto e converte com Integer.parseInt. Com a entrada vinte, ele quebra com NumberFormatException. Capture a exceção e mostre Isso não é um número: vinte.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        System.out.print("Idade: ");
        String texto = entrada.nextLine();
        int idade = Integer.parseInt(texto);
        System.out.println("Ano que vem você terá " + (idade + 1));
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        System.out.print("Idade: ");
        String texto = entrada.nextLine();
        try {
            int idade = Integer.parseInt(texto);
            System.out.println("Ano que vem você terá " + (idade + 1));
        } catch (NumberFormatException e) {
            System.out.println("Isso não é um número: " + texto);
        }
    }
}

NullPointerException em detalhe

É a exceção mais famosa do Java. Desde o Java 14 (e por padrão desde o 15), a mensagem diz o que era null (são as helpful NullPointerExceptions). Com um atributo static que nunca recebeu valor:

$ java Main.java
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "Main.apelido" is null
	at Main.main(Main.java:5)

"Não dá para chamar toUpperCase() porque Main.apelido é null." Com uma variável local, porém, aparece um nome estranho:

$ java Main.java
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null
	at Main.main(Main.java:4)
$ javac -g Main.java
$ java Main
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "nome" is null
	at Main.main(Main.java:4)

<local1> é "a variável local número 1". Os nomes das variáveis locais só ficam guardados no .class quando você compila com javac -g (de debug, "depuração"); o java Main.java e o javac comum não guardam. Nos dois casos, a linha (Main.java:4) leva direto ao problema. O Maven e as IDEs já compilam com -g.

Causa comumExemploCorreção
Atributo de objeto nunca inicializadoprivate List<String> itens; e depois itens.add(…)private List<String> itens = new ArrayList<>();
Map.get de chave inexistentemapa.get("L9").getTitulo()Confira containsKey ou o null; use getOrDefault.
Método que devolve null quando não achabuscar(codigo).getNome()Faça o método lançar uma exceção clara ou devolver Optional (veja o projeto da biblioteca).
Array de objetos recém-criadoString[] nomes = new String[3]; nomes[0].length()Os itens começam null: preencha antes.
Comparar com o lado erradoresposta.equals("s") com resposta == null"s".equals(resposta) nunca dá NPE.

Missão: a classe Carrinho esqueceu de criar a lista, e o programa termina com NullPointerException. Rode, leia a mensagem e conserte inicializando o atributo, para mostrar Total de itens: 1.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Carrinho c = new Carrinho();
        c.adicionar("pão");
        System.out.println("Total de itens: " + c.total());
    }
}

class Carrinho {
    private List<String> itens;

    void adicionar(String item) {
        itens.add(item);
    }

    int total() {
        return itens.size();
    }
}
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Carrinho c = new Carrinho();
        c.adicionar("pão");
        System.out.println("Total de itens: " + c.total());
    }
}

class Carrinho {
    private List<String> itens = new ArrayList<>();

    void adicionar(String item) {
        itens.add(item);
    }

    int total() {
        return itens.size();
    }
}

Errors: quando a JVM não aguenta

ErrorQuando aconteceMensagem realComo evitarAula
StackOverflowErrorRecursão sem fim: um método que chama a si mesmo sem caso base.java.lang.StackOverflowError, seguido de centenas de at Main.contar(Main.java:3)Todo método recursivo precisa de um caso base que pare.Recursão
OutOfMemoryErrorAcabou a memória reservada para os objetos (o heap).java.lang.OutOfMemoryError: Java heap spaceNão guarde tudo de uma vez (leia arquivos aos poucos); se for preciso, aumente com java -Xmx2g.JDK, JRE e JVM
$ java Main.java
Exception in thread "main" java.lang.StackOverflowError
	at Main.contar(Main.java:3)
	at Main.contar(Main.java:3)
	at Main.contar(Main.java:3)
	at Main.contar(Main.java:3)
…                                       « a mesma linha se repete: a saída inteira tem 1020 linhas
$ java -Xmx64m Main.java                « um array de 100 milhões de long (800 MB) com só 64 MB
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at Main.main(Main.java:3)
…

E quando o java nem acha a classe

Não é uma exceção do seu programa, mas aparece com a palavra "Exception": a classe pedida não existe (nome errado, pasta errada ou faltou compilar). A primeira parte vem em português, do lançador java:

$ java Olaa
Erro: Não foi possível localizar nem carregar a classe principal Olaa
Causada por: java.lang.ClassNotFoundException: Olaa

Veja javac e java.


Exercícios

1. Qual linha do stack trace você deve olhar primeiro?

2. int[] v = new int[3]; O que v[3] = 1; lança?

3. Por que "s".equals(resposta) é mais seguro que resposta.equals("s")?

4. Qual destas é checked (o compilador obriga a tratar)?

Complete o catch que trata o texto que não virou número:

} catch ( e) {

Resumo

  • Leia: tipo da exceção, mensagem e a primeira linha at do seu arquivo.
  • Unchecked (RuntimeException) costuma ser defeito no código; checked (IOException…) é algo externo que você deve tratar.
  • Os campeões: NullPointerException, índices fora do limite, NumberFormatException, InputMismatchException, ConcurrentModificationException.
  • <local1> na mensagem do NPE = variável local de um código compilado sem -g.