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.

Você vai aprender
  • 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 Scanner e argumentos para o main.
  • 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.");
    }
}
PartePara 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 numeradasOnde 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.
RestaurarVolta o código ao que estava quando a página abriu. Use quando se perder.
Ver soluçãoSó nas missões: mostra uma resposta possível. Tente antes de clicar!
A área de saídaO 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çãoExceção
QuandoAntes de rodarDurante a execução
Quem avisaO javacA JVM
Começa comMain.java:3: error:Exception in thread "main"
O programa rodou?Nem um poucoAté a linha do problema
AulaLendo Erros do javacO 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 JDKDiferente 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), ScannerRecursão muito profunda: o StackOverflowError chega antes que na JVM real.
Classes, herança, interfaces, enum, record, exceções com o rastro no formato realReflexã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 javacErros de sintaxe raros podem vir com outro texto.
Arquivos (Files, Path) numa pasta fictícia da AnaA 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 comunsO número depois do @ (como Main@1b6d3586) é inventado; na JVM, muda a cada execução de qualquer jeito.
Se o simulador e o JDK discordarem, vale o JDK

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 Scanner pelo campo de entrada; argumentos do main pelo 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.