Java Erros do Compilador
Antes de rodar, o javac lê o seu código inteiro e recusa o que não segue as regras do Java. As mensagens vêm sempre em inglês (o JDK não tem tradução para o compilador) e assustam no começo, mas são poucas e se repetem muito. Aqui estão as 36 mais comuns, cada uma com o código que a provoca, a saída real do javac do JDK 25, a tradução e a correção.
- Como ler uma mensagem do javac.
- Índice das 36 mensagens, agrupadas em sintaxe, nomes, tipos, métodos e variáveis e exceções e orientação a objetos.
- Se o programa compila mas quebra ao rodar, o assunto é outro: veja Exceções Comuns.
Como ler uma mensagem do javac
$ javac Main.java
Main.java:4: error: cannot find symbol
System.out.println(idadee);
^
symbol: variable idadee
location: class Main
1 error
- Main.java:4
- O arquivo e a linha do problema.
- error: cannot find symbol
- A mensagem: o tipo do erro. É ela que você procura no índice abaixo.
- System.out.println(idadee);
- A linha do código, copiada.
- ^
- O "chapéu" aponta a coluna exata onde o javac percebeu o problema.
- symbol / location
- Detalhes extras de algumas mensagens: aqui, o que não foi encontrado e onde o javac procurou.
- 1 error
- O total. Com erros, nenhum
.classé gerado.
- Corrija o primeiro erro primeiro e compile de novo. Um erro de sintaxe costuma gerar outros "em cascata", que somem sozinhos.
- Olhe também a linha de cima. Num
';' expected, o;que falta é no fim da linha indicada, mas às vezes o problema real (uma chave ou aspa aberta) está antes. - Com
java Main.java(modo arquivo-fonte), as mensagens são as mesmas, com uma linha a mais no fim:error: compilation failed.
Para treinar a leitura com calma, veja a aula Lendo Erros do javac.
Experimente provocar: este programa compila. Troque idade por idadee no println, rode e compare a mensagem com a do exemplo acima.
public class Main {
public static void main(String[] args) {
int idade = 29;
System.out.println(idade);
}
}
public class Main {
public static void main(String[] args) {
int idade = 29;
System.out.println(idadee);
}
}
Índice
Sintaxe: pontuação, chaves e aspas
1. ';' expected
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int idade = 29
System.out.println(idade);
}
}
$ javac Main.java
Main.java:3: error: ';' expected
int idade = 29
^
1 error
O que quer dizer: "Esperava um ;." Faltou o ponto e vírgula no fim da instrução. Repare que a seta aponta para depois do 29, e a linha informada é a do erro, não a seguinte.
Correção: Acrescente o ;: int idade = 29; Aula: Sintaxe e Estrutura.
2. reached end of file while parsing
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
System.out.println("Olá");
}
$ javac Main.java
Main.java:4: error: reached end of file while parsing
}
^
1 error
O que quer dizer: "Cheguei ao fim do arquivo enquanto lia." Alguma chave { não foi fechada: aqui, falta a } da classe.
Correção: Conte as chaves; um editor com recuo automático ajuda a ver onde falta. Acrescente a } final. Aula: Sintaxe e Estrutura.
3. 'else' without 'if'
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int nota = 8;
if (nota >= 7);
{
System.out.println("aprovado");
} else {
System.out.println("reprovado");
}
}
}
$ javac Main.java
Main.java:7: error: 'else' without 'if'
} else {
^
1 error
O que quer dizer: "else sem if." O culpado é o ; logo depois do if (nota >= 7): ele encerra o if (com uma instrução vazia), o bloco { } vira um bloco solto e o else fica órfão.
Correção: Tire o ; depois do ) do if. Aula: if, else if, else.
4. unclosed string literal
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
System.out.println("Olá, Ana);
}
}
$ javac Main.java
Main.java:3: error: unclosed string literal
System.out.println("Olá, Ana);
^
1 error
O que quer dizer: "Texto (literal de String) não fechado." Faltou a aspa do fim.
Correção: System.out.println("Olá, Ana"); Aula: Strings.
5. empty character literal / unclosed character literal
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
char letra = '';
char inicial = 'Ana';
}
}
$ javac Main.java
Main.java:3: error: empty character literal
char letra = '';
^
Main.java:4: error: unclosed character literal
char inicial = 'Ana';
^
Main.java:4: error: unclosed character literal
char inicial = 'Ana';
^
Main.java:4: error: not a statement
char inicial = 'Ana';
^
4 errors
O que quer dizer: Aspas simples são para um caractere: '' está vazio e 'Ana' tem três. O javac se perde e mostra erros em cascata.
Correção: Um caractere: char letra = 'A';. Texto: aspas duplas e String. Aula: char e boolean.
6. illegal start of expression
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
System.out.println("Olá");
static void outro() {
System.out.println("outro");
}
}
}
$ javac Main.java
Main.java:5: error: illegal start of expression
static void outro() {
^
Main.java:9: error: class, interface, annotation type, enum, record, method or field expected
}
^
2 errors
O que quer dizer: "Início ilegal de expressão." Um método foi escrito dentro de outro (o main não foi fechado antes). O segundo erro é consequência do primeiro.
Correção: Feche o main com } antes de começar o outro método. Métodos ficam lado a lado, dentro da classe. Aula: Métodos.
7. invalid method declaration; return type required
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
}
}
class Conta {
double saldo;
Contas(double saldo) {
this.saldo = saldo;
}
}
$ javac Main.java
Main.java:9: error: invalid method declaration; return type required
Contas(double saldo) {
^
1 error
O que quer dizer: "Declaração de método inválida; tipo de retorno obrigatório." O construtor foi escrito Contas, e a classe se chama Conta: para o Java, virou um método sem tipo de retorno.
Correção: O construtor tem exatamente o nome da classe: Conta(double saldo). Aula: Construtores.
Nomes: símbolos, maiúsculas e arquivos
8. cannot find symbol (variable)
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int idade = 29;
System.out.println(idadee);
}
}
$ javac Main.java
Main.java:4: error: cannot find symbol
System.out.println(idadee);
^
symbol: variable idadee
location: class Main
1 error
O que quer dizer: "Não encontrei o símbolo." As linhas symbol e location dizem o quê (a variável idadee) e onde procurou (na classe Main). Quase sempre é nome digitado errado ou variável declarada em outro bloco.
Correção: Corrija o nome: idade. Se o nome está certo, veja se a variável foi declarada num bloco { } que já terminou (escopo). Aula: Lendo Erros do javac.
9. cannot find symbol (method)
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
String nome = "Ana";
System.out.println(nome.lenght());
}
}
$ javac Main.java
Main.java:4: error: cannot find symbol
System.out.println(nome.lenght());
^
symbol: method lenght()
location: variable nome of type String
1 error
O que quer dizer: O método lenght() não existe em String ("variable nome of type String").
Correção: nome.length(). Confira o nome exato na referência de String. Aula: Métodos de String.
10. cannot find symbol (class)
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
}
}
$ javac Main.java
Main.java:3: error: cannot find symbol
Scanner entrada = new Scanner(System.in);
^
symbol: class Scanner
location: class Main
Main.java:3: error: cannot find symbol
Scanner entrada = new Scanner(System.in);
^
symbol: class Scanner
location: class Main
2 errors
O que quer dizer: A classe Scanner não foi encontrada (aparece duas vezes porque o nome está duas vezes na linha). Faltou o import.
Correção: Primeira linha do arquivo: import java.util.Scanner; Aula: Pacotes e import.
11. cannot find symbol (class string) / package system does not exist
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
string nome = "Ana";
system.out.println(nome);
}
}
$ javac Main.java
Main.java:3: error: cannot find symbol
string nome = "Ana";
^
symbol: class string
location: class Main
Main.java:4: error: package system does not exist
system.out.println(nome);
^
2 errors
O que quer dizer: O Java diferencia maiúsculas: string não é String, e system não é System (o javac achou que system fosse um pacote).
Correção: String e System, com maiúscula. Nomes de classe sempre começam com maiúscula. Aula: Sintaxe e Estrutura.
12. class X is public, should be declared in a file named X.java
Este código tem um erro de propósito.
public class Ola {
public static void main(String[] args) {
System.out.println("Olá");
}
}
$ javac Main.java
Main.java:1: error: class Ola is public, should be declared in a file named Ola.java
public class Ola {
^
1 error
O que quer dizer: "A classe Ola é pública e deveria estar num arquivo chamado Ola.java."
Correção: Renomeie o arquivo para Ola.java ou a classe para Main. Maiúsculas contam. Aula: Olá, Mundo.
13. variable … is already defined in method …
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int total = 10;
int total = 20;
}
}
$ javac Main.java
Main.java:4: error: variable total is already defined in method main(String[])
int total = 20;
^
1 error
O que quer dizer: "A variável total já foi definida no método main." Declarou duas vezes.
Correção: Para mudar o valor, só atribua: total = 20; (sem o int). Aula: Variáveis.
Tipos incompatíveis
14. incompatible types: String cannot be converted to int
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int idade = "29";
}
}
$ javac Main.java
Main.java:3: error: incompatible types: String cannot be converted to int
int idade = "29";
^
1 error
O que quer dizer: "Tipos incompatíveis: String não pode ser convertida para int." "29" entre aspas é texto.
Correção: Sem aspas: int idade = 29;. Se o texto vem de fora, converta: Integer.parseInt("29"). Aula: Conversão de Tipos.
15. incompatible types: possible lossy conversion from double to int
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
double media = 7.5;
int nota = media;
}
}
$ javac Main.java
Main.java:4: error: incompatible types: possible lossy conversion from double to int
int nota = media;
^
1 error
O que quer dizer: "Possível perda na conversão de double para int." O Java não joga fora as casas decimais sem você pedir.
Correção: Cast explícito, se a perda é aceitável: int nota = (int) media; (corta: 7). Ou (int) Math.round(media) (arredonda: 8). Aula: Conversão de Tipos.
16. integer number too large
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
long populacao = 8000000000;
}
}
$ javac Main.java
Main.java:3: error: integer number too large
long populacao = 8000000000;
^
1 error
O que quer dizer: "Número inteiro grande demais." Um número escrito no código é int por padrão, e 8 bilhões não cabe num int (mesmo indo para um long).
Correção: Ponha L no fim: 8000000000L (ou 8_000_000_000L). Aula: int, long, short, byte.
17. bad operand types for binary operator '&&'
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int idade = 20;
if (idade >= 18 && "sim") {
System.out.println("pode");
}
}
}
$ javac Main.java
Main.java:4: error: bad operand types for binary operator '&&'
if (idade >= 18 && "sim") {
^
first type: boolean
second type: String
1 error
O que quer dizer: "Tipos de operando ruins para o operador &&." O && só junta boolean com boolean, e "sim" é String.
Correção: Compare de verdade: idade >= 18 && resposta.equals("sim"). Aula: Operadores Lógicos.
18. bad operand types for binary operator '=='
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int quantidade = 5;
if (quantidade == "5") {
System.out.println("cinco");
}
}
}
$ javac Main.java
Main.java:4: error: bad operand types for binary operator '=='
if (quantidade == "5") {
^
first type: int
second type: String
1 error
O que quer dizer: Comparar um int com uma String não faz sentido para o Java.
Correção: quantidade == 5 (número com número). Para textos, equals. Aula: Operadores de Comparação.
19. int cannot be dereferenced
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int idade = 29;
System.out.println(idade.length());
}
}
$ javac Main.java
Main.java:4: error: int cannot be dereferenced
System.out.println(idade.length());
^
1 error
O que quer dizer: "int não pode ser desreferenciado": tipos primitivos (int, double, char…) não têm métodos, então não aceitam o ponto.
Correção: Converta para texto se precisar: String.valueOf(idade).length(). Aula: Tipos Primitivos.
20. 'void' type not allowed here
Este código tem um erro de propósito.
public class Main {
static void saudar() {
System.out.println("Olá");
}
public static void main(String[] args) {
System.out.println(saudar());
}
}
$ javac Main.java
Main.java:7: error: 'void' type not allowed here
System.out.println(saudar());
^
1 error
O que quer dizer: "Tipo void não permitido aqui." saudar() não devolve nada, então não há o que imprimir.
Correção: Chame sozinho: saudar();. Ou faça o método devolver uma String. Aula: Valores de Retorno.
21. array required, but String found
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
String nome = "Ana";
System.out.println(nome[0]);
}
}
$ javac Main.java
Main.java:4: error: array required, but String found
System.out.println(nome[0]);
^
1 error
O que quer dizer: "Era preciso um array, mas encontrei uma String." Colchetes só funcionam em arrays.
Correção: nome.charAt(0). Aula: Métodos de String.
22. unexpected type (required: reference, found: int)
Este código tem um erro de propósito.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<int> numeros = new ArrayList<>();
}
}
$ javac Main.java
Main.java:6: error: unexpected type
List<int> numeros = new ArrayList<>();
^
required: reference
found: int
1 error
O que quer dizer: Generics só aceitam tipos de referência (classes), não primitivos.
Correção: Use o wrapper: List<Integer>. Aula: Wrappers e Autoboxing.
23. incompatible types: int cannot be converted to String
Este código tem um erro de propósito.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> nomes = new ArrayList<>();
nomes.add(42);
}
}
$ javac Main.java
Main.java:7: error: incompatible types: int cannot be converted to String
nomes.add(42);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
O que quer dizer: A lista é de String e recebeu um int. É o generics protegendo você.
Correção: nomes.add("42"), ou uma List<Integer> se forem números. Aula: Generics.
Métodos, variáveis e fluxo
24. missing return statement
Este código tem um erro de propósito.
public class Main {
static String situacao(double nota) {
if (nota >= 7) {
return "aprovado";
} else if (nota < 7) {
return "reprovado";
}
}
public static void main(String[] args) {
System.out.println(situacao(8));
}
}
$ javac Main.java
Main.java:8: error: missing return statement
}
^
1 error
O que quer dizer: "Falta a instrução return." O método promete devolver uma String, e o javac não tem certeza de que todo caminho termina num return (ele não deduz que >= 7 e < 7 cobrem tudo). A seta aponta para a } do método.
Correção: Troque o último else if (…) por else, ou acrescente um return no fim. Aula: Valores de Retorno.
25. variable … might not have been initialized
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
int total;
total = total + 10;
System.out.println(total);
}
}
$ javac Main.java
Main.java:4: error: variable total might not have been initialized
total = total + 10;
^
1 error
O que quer dizer: "A variável total pode não ter sido inicializada." Variáveis locais não começam com zero: precisam de um valor antes de serem lidas.
Correção: int total = 0; Aula: Variáveis.
26. unreachable statement
Este código tem um erro de propósito.
public class Main {
static int dobro(int x) {
return x * 2;
System.out.println("calculado");
}
public static void main(String[] args) {
System.out.println(dobro(4));
}
}
$ javac Main.java
Main.java:4: error: unreachable statement
System.out.println("calculado");
^
1 error
O que quer dizer: "Instrução inalcançável." Nada depois de um return (ou break, continue, throw) no mesmo bloco pode rodar.
Correção: Mova a linha para antes do return, ou apague. Aula: Valores de Retorno.
27. non-static variable … cannot be referenced from a static context
Este código tem um erro de propósito.
public class Main {
int contador = 0;
public static void main(String[] args) {
contador++;
}
}
$ javac Main.java
Main.java:5: error: non-static variable contador cannot be referenced from a static context
contador++;
^
1 error
O que quer dizer: "Variável não estática não pode ser usada num contexto estático." O main é static (da classe), e contador é de cada objeto: não há objeto nenhum ali.
Correção: Marque como static int contador, ou crie um objeto: new Main().contador++. Aula: static.
28. non-static method … cannot be referenced from a static context
Este código tem um erro de propósito.
public class Main {
void saudar() {
System.out.println("Olá");
}
public static void main(String[] args) {
saudar();
}
}
$ javac Main.java
Main.java:7: error: non-static method saudar() cannot be referenced from a static context
saudar();
^
1 error
O que quer dizer: O mesmo, com um método.
Correção: static void saudar(), ou new Main().saudar(); Aula: static.
29. method … cannot be applied to given types
Este código tem um erro de propósito.
public class Main {
static int somar(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(somar(2));
System.out.println(somar(2, "3"));
}
}
$ javac Main.java
Main.java:7: error: method somar in class Main cannot be applied to given types;
System.out.println(somar(2));
^
required: int,int
found: int
reason: actual and formal argument lists differ in length
Main.java:8: error: incompatible types: String cannot be converted to int
System.out.println(somar(2, "3"));
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors
O que quer dizer: "O método somar não pode ser aplicado aos tipos dados." required: int,int (o que o método pede) e found: int (o que você passou): faltou um argumento. Na segunda chamada, o "3" é texto.
Correção: Passe dois int: somar(2, 3). A nota sobre -Xdiags:verbose só diz que existe uma versão mais longa da mensagem. Aula: Parâmetros e Argumentos.
30. constructor … cannot be applied to given types
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
Pessoa p = new Pessoa();
}
}
class Pessoa {
String nome;
Pessoa(String nome) {
this.nome = nome;
}
}
$ javac Main.java
Main.java:3: error: constructor Pessoa in class Pessoa cannot be applied to given types;
Pessoa p = new Pessoa();
^
required: String
found: no arguments
reason: actual and formal argument lists differ in length
1 error
O que quer dizer: O único construtor de Pessoa pede uma String (required: String), e foi chamado sem nada (found: no arguments). Quando você escreve um construtor, o construtor vazio automático deixa de existir.
Correção: new Pessoa("Ana"), ou escreva também um construtor sem parâmetros. Aula: Construtores.
31. the switch expression does not cover all possible input values
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
String dia = "sab";
String tipo = switch (dia) {
case "sab", "dom" -> "fim de semana";
};
System.out.println(tipo);
}
}
$ javac Main.java
Main.java:4: error: the switch expression does not cover all possible input values
String tipo = switch (dia) {
^
1 error
O que quer dizer: Um switch que devolve valor precisa de uma resposta para qualquer entrada; uma String pode ser qualquer coisa.
Correção: Acrescente default -> "dia útil"; Aula: switch com Setas.
Exceções e orientação a objetos
32. unreported exception …; must be caught or declared to be thrown
Este código tem um erro de propósito.
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) {
String texto = Files.readString(Path.of("notas.txt"));
System.out.println(texto);
}
}
$ javac Main.java
Main.java:6: error: unreported exception IOException; must be caught or declared to be thrown
String texto = Files.readString(Path.of("notas.txt"));
^
1 error
O que quer dizer: "Exceção não informada; precisa ser capturada ou declarada." IOException é checked: o compilador obriga a decidir o que fazer.
Correção: try { … } catch (IOException e) { … }, ou throws IOException na assinatura do método (e o import java.io.IOException;). Aula: Checked × Unchecked.
33. exception … is never thrown in body of corresponding try statement
Este código tem um erro de propósito.
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
System.out.println("Olá");
} catch (IOException e) {
System.out.println("erro");
}
}
}
$ javac Main.java
Main.java:7: error: exception IOException is never thrown in body of corresponding try statement
} catch (IOException e) {
^
1 error
O que quer dizer: "A exceção nunca é lançada no corpo do try." Capturar uma exceção checked que o bloco não pode lançar é erro.
Correção: Tire o catch, ou capture uma exceção que faça sentido ali. Aula: try e catch.
34. cannot assign a value to final variable
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
final double TAXA = 0.05;
TAXA = 0.06;
}
}
$ javac Main.java
Main.java:4: error: cannot assign a value to final variable TAXA
TAXA = 0.06;
^
1 error
O que quer dizer: "Não dá para atribuir valor à variável final TAXA." Constante é constante.
Correção: Tire o final se o valor precisa mudar, ou crie outra variável. Aula: Constantes (final).
35. X is not abstract and does not override abstract method y() in Z
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
}
}
interface Forma {
double area();
}
class Quadrado implements Forma {
double lado;
}
$ javac Main.java
Main.java:10: error: Quadrado is not abstract and does not override abstract method area() in Forma
class Quadrado implements Forma {
^
1 error
O que quer dizer: "Quadrado não é abstrata e não implementa o método abstrato area() de Forma." Quem implementa uma interface precisa escrever todos os métodos dela.
Correção: Escreva o método: public double area() { return lado * lado; } Aula: Interfaces.
36. … has private access in …
Este código tem um erro de propósito.
public class Main {
public static void main(String[] args) {
Conta c = new Conta();
c.saldo = 1000;
}
}
class Conta {
private double saldo;
}
$ javac Main.java
Main.java:4: error: saldo has private access in Conta
c.saldo = 1000;
^
1 error
O que quer dizer: "saldo tem acesso privado em Conta." É o encapsulamento funcionando.
Correção: Use os métodos públicos da classe (depositar, getSaldo). Aula: Encapsulamento.
Missão: três erros num programa só
Missão: este programa tem três erros desta página. Rode, corrija um de cada vez (sempre o primeiro da lista) e faça-o mostrar Média: 8.0.
public class Main {
public static void main(String[] args) {
double nota1 = 7.5
double nota2 = 8.5;
String media = (nota1 + nota2) / 2;
system.out.println("Média: " + media);
}
}
public class Main {
public static void main(String[] args) {
double nota1 = 7.5;
double nota2 = 8.5;
double media = (nota1 + nota2) / 2;
System.out.println("Média: " + media);
}
}
Exercícios
1. O javac mostrou 7 erros. O que fazer primeiro?
2. variable total might not have been initialized quer dizer…
3. non-static method saudar() cannot be referenced from a static context aparece porque…
4. Qual a correção de integer number too large em long p = 8000000000;?
Complete a mensagem que aparece quando falta o ponto e vírgula:
Resumo
- Formato:
Arquivo.java:linha: error: mensagem, a linha copiada e o^na coluna. - Corrija sempre o primeiro erro e compile de novo.
- Os campeões:
';' expected,cannot find symbol,incompatible types,missing return statement,might not have been initialized,non-static … static context. - As mensagens são sempre em inglês; esta página e a aula Lendo Erros do javac traduzem.