Java O Editor do Guia
Toda aula tem caixas onde você muda o código e roda na hora, sem instalar nada: o editor Experimente e o JShell do guia. Os dois funcionam dentro da página, com um simulador de Java que imita o JDK 25, inclusive nas mensagens de erro. Esta aula ensina a usar cada botão, a cumprir as missões e mostra o que o simulador sabe e não sabe fazer.
- As partes de uma caixa Experimente e os botões Rodar, Restaurar e Ver solução.
- Como ler a saída, os erros de compilação, as exceções e o código de saída.
- Como cumprir uma missão e como ela é conferida.
- Como dar entrada para o
Scannere argumentos para omain. - Como usar o JShell do guia.
- O que o simulador faz igual ao Java de verdade e o que ele não faz.
A ideia: um simulador de voo
Pilotos treinam em simuladores: a cabine é igual à do avião, os instrumentos respondem do mesmo jeito, mas um erro não derruba nada. O editor do guia é isso para o Java: você escreve um programa, clica em Rodar e vê exatamente o que o Java mostraria, inclusive as mensagens de erro em inglês do compilador. Nada sai da página, nada mexe no seu computador, e o botão Restaurar desfaz qualquer estrago.
O simulador foi testado contra o JDK 25 real, com os mesmos programas, para que as saídas sejam iguais. Mesmo assim, ele é um treino: quando você instalar o JDK (Linux, Windows e macOS), repita os exemplos no terminal.
As partes de uma caixa Experimente
Esta é uma caixa "livre", sem missão: só para brincar. Clique em Rodar.
Brinque com o código: rode, mude o texto e rode de novo. Depois clique em Restaurar para voltar ao original.
public class Main {
public static void main(String[] args) {
System.out.println("Bom dia, Ana!");
System.out.println("Hoje tem aula de Java.");
}
}
| Parte | Para que serve |
|---|---|
| A tarefa (Missão ou Brinque com o código) | O que fazer nesta caixa. Leia antes de mexer. |
A aba com o nome do arquivo (Main.java) | O arquivo que você está editando. Como no Java real, o nome do arquivo e o nome da classe pública precisam combinar. |
| O editor, com as linhas numeradas | Onde você escreve. Os números ajudam a achar a linha que o erro aponta. A tecla Tab recua o código. |
| Rodar | "Compila" o código, como o javac, e, se não houver erro, executa, como o java. |
| Restaurar | Volta o código ao que estava quando a página abriu. Use quando se perder. |
| Ver solução | Só nas missões: mostra uma resposta possível. Tente antes de clicar! |
| A área de saída | O que o programa escreveu na tela, os erros e, no fim, o código de saída. |
O que o Rodar faz
Clicar em Rodar equivale a dois comandos no terminal: compilar e executar. Na máquina da Ana, com o mesmo programa:
$ javac Main.java && java Main « compila e, se der certo, roda Bom dia, Ana! Hoje tem aula de Java. $ echo $? 0 « o código de saída: 0 = terminou bem
O código de saída é um número que todo programa devolve ao terminar. 0 quer dizer "terminou sem problema"; qualquer outro número indica um problema. O editor mostra esse número no fim da saída, como o echo $? do terminal. As aulas javac e java e Saída: print e println voltam a ele.
Quando o código tem erro
O editor mostra dois tipos de problema, os mesmos do Java real.
1. Erro de compilação: o programa nem roda
Se o código quebra uma regra da linguagem, o "compilador" do simulador recusa e mostra a mensagem no formato do javac: o arquivo e a linha, a descrição em inglês, a linha copiada e um ^ embaixo do ponto do problema. Nada do programa é executado. Compare com o javac real, para o código abaixo sem o ;:
$ javac Main.java
Main.java:3: error: ';' expected
System.out.println("Olá, Ana")
^
1 error
Missão: o código tem um erro de propósito. Rode, leia a mensagem (em que linha está o erro? o que está faltando?) e conserte.
public class Main {
public static void main(String[] args) {
System.out.println("Olá, Ana")
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Olá, Ana");
}
}
Cada mensagem do javac é explicada em Lendo Erros do javac.
2. Exceção: o programa começa e quebra no meio
Outras vezes o código está escrito certo, mas pede uma coisa impossível enquanto roda, como dividir por zero. O Java para o programa e mostra uma exceção: o nome do problema e a linha onde ele aconteceu. O que já tinha sido escrito na tela continua lá. Real, no terminal:
$ java Main.java Dividindo 10 maçãs entre 0 pessoas... « a linha 3 rodou Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:4) « o problema foi na linha 4 $ echo $? 1 « código de saída 1: terminou com erro
Brinque com o código: rode e compare com o terminal acima: a primeira linha aparece, a exceção vem em seguida e a última linha nunca roda. Troque o 0 por 2 e rode de novo.
public class Main {
public static void main(String[] args) {
System.out.println("Dividindo 10 maçãs entre 0 pessoas...");
System.out.println(10 / 0);
System.out.println("Esta linha nunca aparece.");
}
}
| Erro de compilação | Exceção | |
|---|---|---|
| Quando | Antes de rodar | Durante a execução |
| Quem avisa | O javac | A JVM |
| Começa com | Main.java:3: error: | Exception in thread "main" |
| O programa rodou? | Nem um pouco | Até a linha do problema |
| Aula | Lendo Erros do javac | O que são Exceções |
Missões
A maioria das caixas tem uma missão: um objetivo que o simulador confere quando você clica em Rodar. Quando o objetivo é cumprido, a caixa avisa que a missão foi concluída. O que pode ser conferido:
| A missão pede… | Exemplo |
|---|---|
| Que a saída contenha um texto | "Faça o programa mostrar Olá, Ana!" |
| Que o código compile | "Conserte o erro" |
| Que o código não compile, com um erro específico | "Provoque o erro ';' expected" (para você conhecer a mensagem) |
| Que o programa termine com uma exceção ou um código de saída | "Faça o programa terminar com ArithmeticException" |
| Que o código use um recurso | "Use um for", "use *" |
Por isso, às vezes a saída está certa e a missão não conclui: talvez ela peça um jeito específico de fazer. Releia a tarefa. Se travar, Ver solução mostra uma resposta; quase sempre há outras respostas certas.
Missão: a lista de preços da Ana está incompleta. Acrescente a linha Uva: 5 reais no fim. Antes de clicar em Ver solução, tente sozinho: copie uma linha inteira, cole embaixo e mude o texto.
public class Main {
public static void main(String[] args) {
System.out.println("Maçã: 3 reais");
System.out.println("Banana: 2 reais");
}
}
public class Main {
public static void main(String[] args) {
System.out.println("Maçã: 3 reais");
System.out.println("Banana: 2 reais");
System.out.println("Uva: 5 reais");
}
}
Entrada do teclado (Scanner)
Programas podem pedir que a pessoa digite algo. Em Java, isso se faz com o Scanner (a aula Ler do Teclado explica cada linha). No terminal, o programa para e espera você digitar e apertar Enter:
$ java Main.java Qual é o seu nome? Ana « o programa perguntou; a Ana digitou "Ana" e Enter Olá, Ana!
No editor do guia, quando o programa usa o Scanner, aparece um campo de entrada: o que você escrever ali é entregue ao programa, linha por linha, como se tivesse sido digitado no teclado. Algumas caixas já vêm com a entrada preenchida. Experimente:
Brinque: clique em Rodar. Quando o programa perguntar o nome, escreva o seu no campo que aparece e aperte Enter. Rode de novo com outro nome.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.print("Qual é o seu nome? ");
String nome = teclado.nextLine();
System.out.println("Olá, " + nome + "!");
}
}
Repare numa diferença: no terminal, o que você digita aparece na tela (é o terminal que mostra as teclas). Quando a entrada vem de um campo ou de um arquivo, ela não aparece no meio da saída, e a resposta fica na mesma linha da pergunta: Qual é o seu nome? Olá, Ana!. É assim também no Java real quando a entrada vem de um arquivo.
Argumentos do main
Outra forma de passar informação a um programa é escrevê-la na própria linha de comando, depois do nome do programa. São os argumentos, que chegam no String[] args do main (a aula Argumentos da Linha de Comando explica):
$ java Main.java Ana 29 « dois argumentos: "Ana" e "29" Você passou 2 argumentos. O primeiro é: Ana
Nas caixas que usam argumentos, há um campo Argumentos acima da saída, já preenchido. Mude o que está lá e rode:
Brinque com o código: troque os argumentos por Bruno 31 São Paulo e rode. Quantos argumentos foram? (Espaço separa argumentos.) Depois apague todos e rode: o que acontece?
public class Main {
public static void main(String[] args) {
System.out.println("Você passou " + args.length + " argumentos.");
System.out.println("O primeiro é: " + args[0]);
}
}
Sem argumentos, o programa quebra, igual ao Java real, porque não existe "primeiro argumento":
$ java Main.java Você passou 0 argumentos. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at Main.main(Main.java:4)
Outros nomes de arquivo e vários arquivos
Quase todas as caixas usam o arquivo Main.java, com a classe Main. Quando a aula usa outro nome, a aba mostra esse nome, e a classe tem de combinar, como no Java real:
Brinque com o código: este arquivo se chama Conta.java. Rode. Depois troque public class Conta por public class Main e rode de novo: o erro é o mesmo que o javac daria (veja Olá, Mundo).
public class Conta {
public static void main(String[] args) {
System.out.println("Saldo: 150 reais");
}
}
Programas maiores têm vários arquivos. Nesses casos, a caixa mostra uma aba para cada arquivo; clique na aba para ver e editar o outro. O Rodar compila todos juntos e executa a classe da primeira aba. No terminal, isso seria:
$ javac *.java « compila todos os .java da pasta $ ls Main.class Main.java Mensagens.class Mensagens.java $ java Main Bem-vinda à loja, Ana! Volte sempre!
Brinque com o código: abra a aba Mensagens.java e mude o texto da despedida. Rode. (Como uma classe usa a outra é assunto do Nível 2, em Métodos.)
public class Main {
public static void main(String[] args) {
Mensagens.boasVindas("Ana");
Mensagens.despedida();
}
}
public class Mensagens {
static void boasVindas(String nome) {
System.out.println("Bem-vinda à loja, " + nome + "!");
}
static void despedida() {
System.out.println("Volte sempre!");
}
}
O JShell do guia
O JShell é um console do Java: você digita uma expressão ou uma linha de código, aperta Enter e vê o resultado na hora, sem escrever classe nem main. O guia tem uma versão dele no navegador, que responde no mesmo formato do JShell real (a aula JShell ensina tudo):
$ jshell | Welcome to JShell -- Version 25.0.4.1 | For an introduction type: /help intro jshell> 7 + 8 $1 ==> 15 « o resultado ganhou um nome: $1 jshell> int idade = 29 idade ==> 29 jshell> idade + 1 $3 ==> 30
Clique na caixa abaixo, digite uma linha, aperte Enter e veja a resposta. Use as setas ↑ e ↓ para repetir linhas anteriores.
Missão: crie a variável int idade = 29 e depois calcule idade + 1.
int idade = 29 idade + 1
O que o simulador faz e o que não faz
O simulador implementa uma parte grande do Java 25: tudo o que os níveis 1 a 3 usam. Algumas coisas, porém, só existem no Java de verdade.
| Faz igual ao JDK | Diferente ou ausente |
|---|---|
Tipos e contas com a aritmética exata do Java (divisão inteira, double impresso como o Java imprime, estouro de int) | Threads: tudo roda numa linha só, em sequência; Thread.sleep não espera. As aulas de threads mostram as saídas do Java real. |
String, StringBuilder, Math, Random (a mesma sequência do Java com a mesma semente), Scanner | Recursão muito profunda: o StackOverflowError chega antes que na JVM real. |
Classes, herança, interfaces, enum, record, exceções com o rastro no formato real | Reflexão, banco de dados (JDBC), rede, interface gráfica: não existem. |
Coleções, lambdas, streams, Optional, printf, java.time e BigDecimal (o básico) | Maven, Gradle, JAR: só no terminal. |
Os erros de compilação mais comuns, com a mensagem exata do javac | Erros de sintaxe raros podem vir com outro texto. |
Arquivos (Files, Path) numa pasta fictícia da Ana | A pasta volta ao original a cada Rodar; nada é gravado no seu computador. |
Data e hora (LocalDate.now()…) | O relógio é fixo: 15/10/2026, 10h30, horário de Brasília. Assim a saída é sempre a mesma. |
toString() de objetos comuns | O número depois do @ (como Main@1b6d3586) é inventado; na JVM, muda a cada execução de qualquer jeito. |
O guia compara o simulador com o JDK 25 de verdade, mas nenhum simulador é perfeito. Se você rodar um exemplo no seu computador e a saída for diferente da do editor, confie no seu JDK (e confira a versão com java -version: outra versão do Java pode mesmo dar outra saída).
Exercícios
1. Você mexeu tanto no código que não sabe mais como era. Qual botão usar?
2. A saída mostrou Main.java:4: error: cannot find symbol. O que aconteceu?
3. O que quer dizer o código de saída 1 no fim da saída?
4. Um programa usa Thread.sleep(5000) para esperar 5 segundos. O que acontece no editor do guia?
Resumo
- Rodar = compilar (
javac) e executar (java); Restaurar volta ao original; Ver solução mostra uma resposta da missão. - Erro de compilação:
Main.java:N: error: …, nada roda. Exceção:Exception in thread "main" …, o programa para no meio. - O código de saída aparece no fim:
0= tudo bem. - Missões conferem a saída, a compilação, exceções ou o uso de um recurso.
- Entrada do
Scannerpelo campo de entrada; argumentos domainpelo campo Argumentos; vários arquivos em abas. - O JShell do guia responde como o real:
$1 ==> 15. - Threads, reflexão, rede e ferramentas de build só no JDK real; em caso de dúvida, vale o JDK.