Scanner vs JOptionPane: Qual desses dois métodos te enganaria primeiro?
Se você já programou em Java, provavelmente já usou Scanner
para capturar dados do usuário pelo terminal ou JOptionPane
para exibir caixas de diálogo gráficas. Mas será que você conhece todas as pegadinhas que esses dois métodos podem esconder? Vamos descobrir!
A pegadinha do Scanner: O "enter" invisível
Imagine que você está pedindo dois inputs do usuário: um número e um texto. Algo assim:
import java.util.Scanner;
public class ScannerPegadinha {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("\u001B[32mDigite um número: \u001B[0m");
int numero = scanner.nextInt();
System.out.print("\u001B[32mDigite uma palavra: \u001B[0m");
String palavra = scanner.nextLine();
System.out.println("\u001B[34mVocê digitou: \u001B[0m" + numero + " e " + palavra);
scanner.close();
}
}
O que acontece quando rodamos esse código?
👀 Surpresa! O programa nem espera a entrada da palavra! Ele pula direto e imprime uma string vazia. Isso acontece porque nextInt()
lê apenas o número, mas o Enter
que o usuário digitou fica "preso" no buffer. Quando nextLine()
é chamado, ele lê esse Enter
e assume que é a resposta do usuário.
🔧 Como corrigir? Basta adicionar um scanner.nextLine()
extra depois da leitura do nextInt()
para consumir o Enter
pendente.
System.out.print("\u001B[32mDigite um número: \u001B[0m");
int numero = scanner.nextInt();
scanner.nextLine(); // Limpa o buffer
System.out.print("\u001B[32mDigite uma palavra: \u001B[0m");
String palavra = scanner.nextLine();
A pegadinha do JOptionPane: Quando um número não é um número
Agora, vamos para o JOptionPane
. Ele facilita muito a interação com o usuário, mas... ele tem um truque curioso! Veja este código:
import javax.swing.JOptionPane;
public class JOptionPanePegadinha {
public static void main(String[] args) {
String input = JOptionPane.showInputDialog("Digite um número:");
int numero = Integer.parseInt(input);
JOptionPane.showMessageDialog(null, "Você digitou: " + numero);
}
}
Tudo parece normal, certo? Mas tente rodar o programa e digitar algo que não seja um número, como "abc".
💥 Boom! O programa quebra com uma NumberFormatException
. Isso acontece porque JOptionPane
captura entradas como strings, e a conversão para int
não é garantida.
🔧 Como corrigir? Podemos tratar esse erro com um try-catch
:
try {
int numero = Integer.parseInt(input);
JOptionPane.showMessageDialog(null, "Você digitou: " + numero);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Erro: digite um número válido.");
}
Agora, se o usuário digitar algo errado, ele recebe um aviso amigável em vez de um erro fatal.
Scanner ou JOptionPane: Qual deles é mais traiçoeiro?
Depende! O Scanner
pode te pregar uma bela peça com o buffer de entrada, enquanto o JOptionPane
pode derrubar o programa com entradas inesperadas.
🔹 Se você trabalha com terminal: Cuidado com os nextInt()
e nextLine()
juntos! 🔹 Se você usa interface gráfica: Sempre valide as entradas antes de convertê-las.
E você, já caiu em alguma dessas armadilhas? Conta aqui nos comentários! 😆