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.
- Como ler uma exceção em 10 segundos.
- A tabela das exceções comuns: quando, mensagem, como evitar, aula.
- NullPointerException em detalhe (e o misterioso
<local1>). - Errors:
StackOverflowErroreOutOfMemoryError. - Se o problema aparece antes de rodar, ao compilar, veja Erros do Compilador.
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ília | Exemplos | O compilador obriga a tratar? | Normalmente indica |
|---|---|---|---|
RuntimeException e filhas (unchecked) | NullPointerException, ArithmeticException, IndexOutOfBoundsException | Não | Um defeito no código: conserte o código. |
Outras filhas de Exception (checked) | IOException, NoSuchFileException, InterruptedException | Sim: try/catch ou throws | Algo externo que pode falhar (arquivo, rede): trate. |
Error e filhas | StackOverflowError, OutOfMemoryError | Não | Problema 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ção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
ArithmeticException | Divisão inteira por zero: total / pessoas com pessoas = 0. | java.lang.ArithmeticException: / by zero | Confira o divisor antes (if (pessoas != 0)). Com double não há exceção: dá Infinity. | Operadores Aritméticos |
ArithmeticException | BigDecimal.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 |
ArithmeticException | Math.addExact/multiplyExact passou do limite do tipo. | java.lang.ArithmeticException: integer overflow | Use long ou BigInteger se os números podem crescer. | Métodos de Math |
NumberFormatException | Converter 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ção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
ArrayIndexOutOfBoundsException | Posição inexistente num array: notas[3] com 3 notas (posições 0, 1, 2). | java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 | O último índice é length - 1. Em laços, i < notas.length (nunca <=), ou use for-each. | Arrays |
IndexOutOfBoundsException | Posição inexistente numa lista: frutas.get(3) num ArrayList de 3. | java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3 | Confira i < lista.size(). Num List.of(…), a mesma situação dá ArrayIndexOutOfBoundsException. | ArrayList |
StringIndexOutOfBoundsException | Posiçã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 3 | Confira contra length(); cuidado com indexOf que devolveu -1. | Métodos de String |
NegativeArraySizeException | Criar array com tamanho negativo. | java.lang.NegativeArraySizeException: -1 | Valide o tamanho que veio da entrada ou de uma conta. | Arrays |
ArrayStoreException | Guardar um tipo errado num array visto como Object[]: caixas[0] = 42 num String[]. | java.lang.ArrayStoreException: java.lang.Integer | Prefira listas com generics (List<String>): o erro aparece na compilação. | Generics |
Objetos e tipos
| Exceção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
NullPointerException | Usar (chamar método, ler atributo) uma variável que vale null. | java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null | Inicialize as variáveis; confira if (x != null); use Optional para "pode não ter valor". Veja abaixo. | O que são Exceções |
ClassCastException | Converter (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 |
IllegalArgumentException | Um 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 positive | Leia a documentação do método; valide antes de chamar. | throw e throws |
IllegalStateException | O objeto não está em condições de fazer aquilo agora: ler de um Scanner já fechado. | java.lang.IllegalStateException: Scanner closed | Respeite a ordem de uso (não feche o Scanner(System.in) antes de terminar de ler). | Scanner |
Entrada do teclado
| Exceção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
InputMismatchException | nextInt()/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 |
NoSuchElementException | Pedir a próxima linha quando a entrada acabou (Ctrl+D, ou entrada vazia). | java.util.NoSuchElementException: No line found | Confira com hasNextLine()/hasNext(). | Scanner |
Coleções, Optional e iteradores
| Exceção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
UnsupportedOperationException | Alterar 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 |
ConcurrentModificationException | Remover (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 |
NoSuchElementException | Optional.get() num Optional vazio (ex.: o max de uma lista vazia). | java.util.NoSuchElementException: No value present | Use orElse(0), orElseThrow(…) ou ifPresent(…). | Optional |
NoSuchElementException | it.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ção | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
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.txt | Files.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 |
DateTimeParseException | LocalDate.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 0 | Passe o formato: LocalDate.parse(texto, DateTimeFormatter.ofPattern("dd/MM/yyyy")). | Datas e Horas |
DateTimeException | Data 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 |
PatternSyntaxException | Expressã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 comum | Exemplo | Correção |
|---|---|---|
| Atributo de objeto nunca inicializado | private List<String> itens; e depois itens.add(…) | private List<String> itens = new ArrayList<>(); |
Map.get de chave inexistente | mapa.get("L9").getTitulo() | Confira containsKey ou o null; use getOrDefault. |
Método que devolve null quando não acha | buscar(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-criado | String[] nomes = new String[3]; nomes[0].length() | Os itens começam null: preencha antes. |
| Comparar com o lado errado | resposta.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
| Error | Quando acontece | Mensagem real | Como evitar | Aula |
|---|---|---|---|---|
StackOverflowError | Recursã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 |
OutOfMemoryError | Acabou a memória reservada para os objetos (o heap). | java.lang.OutOfMemoryError: Java heap space | Nã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:
Resumo
- Leia: tipo da exceção, mensagem e a primeira linha
atdo 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.