Até agora, nossos programas usaram valores fixos para as variáveis. Mas e se quisermos que o usuário informe esses valores durante a execução do programa? Para isso, usamos a classe Scanner do Java.
A classe Scanner é usada para obter entrada de dados do usuário a partir do console (teclado). Ela permite que seu programa interaja com o usuário, solicitando e recebendo informações durante a execução.
Para usar a classe Scanner, precisamos:
import java.util.Scanner;Scanner scanner = new Scanner(System.in);Veja abaixo um exemplo básico de como usar a classe Scanner para receber entradas do usuário:
// Importando a classe Scanner (deve ser colocado no início do arquivo) import java.util.Scanner; public class ExemploScanner { public static void main(String[] args) { // Criando um objeto Scanner para ler dados da entrada padrão (teclado) Scanner entrada = new Scanner(System.in); // Solicitando o nome do usuário System.out.print("Digite seu nome: "); String nome = entrada.nextLine(); // Lê uma linha de texto // Solicitando a idade do usuário System.out.print("Digite sua idade: "); int idade = entrada.nextInt(); // Lê um número inteiro // Exibindo os dados informados System.out.println("\nDados informados:"); System.out.println("Nome: " + nome); System.out.println("Idade: " + idade + " anos"); // Fechando o Scanner para liberar recursos scanner.close(); } }
Digite seu nome: João Silva
Digite sua idade: 25
Dados informados:
Nome: João Silva
Idade: 25 anos
Veja outro exemplo, que solicita e calcula a média de notas de um aluno:
import java.util.Scanner;
public class CalculoMedia {
public static void main(String[] args) {
// Criando o objeto Scanner
Scanner entrada = new Scanner(System.in);
// Solicitando o nome do aluno
System.out.print("Digite o nome do aluno: ");
String nomeAluno = entrada.nextLine();
// Solicitando as três notas
System.out.print("Digite a primeira nota: ");
double nota1 = entrada.nextDouble();
System.out.print("Digite a segunda nota: ");
double nota2 = entrada.nextDouble();
System.out.print("Digite a terceira nota: ");
double nota3 = entrada.nextDouble();
// Calculando a média
double media = (nota1 + nota2 + nota3) / 3;
// Exibindo o resultado
System.out.println("\nAluno: " + nomeAluno);
System.out.println("Nota 1: " + nota1);
System.out.println("Nota 2: " + nota2);
System.out.println("Nota 3: " + nota3);
System.out.println("Média: " + media);
// Verificando se o aluno está aprovado (média >= 7.0)
if (media >= 7.0) {
System.out.println("Situação: Aprovado");
} else {
System.out.println("Situação: Reprovado");
}
// Fechando o Scanner
entrada.close();
}
}
Digite o nome do aluno: Ana Souza
Digite a primeira nota: 8.5
Digite a segunda nota: 7.0
Digite a terceira nota: 9.5
Aluno: Ana Souza
Nota 1: 8.5
Nota 2: 7.0
Nota 3: 9.5
Média: 8.333333333333334
Situação: Aprovado
Os métodos nextLine(), nextDouble() e nextInt() são usados para ler entrada de dados do usuário através do Scanner em Java.
| Método | Descrição | Tipo de Retorno |
|---|---|---|
nextLine() |
Lê uma linha inteira de texto, incluindo espaços | String |
next() |
Lê a próxima palavra (até encontrar um espaço) | String |
nextInt() |
Lê um número inteiro | int |
nextDouble() |
Lê um número de ponto flutuante | double |
nextBoolean() |
Lê um valor booleano (true ou false) | boolean |
nextLong() |
Lê um número inteiro longo | long |
Existe um problema comum quando usamos nextLine() após métodos como nextInt() ou nextDouble(). Veja o exemplo:
import java.util.Scanner;
public class ProblemaNextLine {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
// Solicita a idade
System.out.print("Digite sua idade: ");
int idade = entrada.nextInt(); // Lê a idade, mas não consume a quebra de linha
// Solicita o nome
System.out.print("Digite seu nome completo: ");
String nome = entrada.nextLine(); // Consome apenas a quebra de linha pendente
// Exibindo os dados informados
System.out.println("\nDados informados:");
System.out.println("Idade: " + idade + " anos");
System.out.println("Nome: " + nome); // Nome provavelmente estará vazio!
scanner.close();
}
}
Digite sua idade: 25
Digite seu nome completo:
Dados informados:
Idade: 25 anos
Nome:
Problema: Quando usamos métodos como nextInt() ou nextDouble(), eles leem apenas o número, mas não consomem a quebra de linha (Enter) que o usuário pressiona. Quando o nextLine() é chamado em seguida, ele encontra essa quebra de linha pendente e a consome imediatamente, sem esperar que o usuário digite algo.
Solução: Adicionar um scanner.nextLine() extra após nextInt() ou nextDouble() para consumir a quebra de linha pendente:
System.out.print("Digite sua idade: ");
int idade = scanner.nextInt();
scanner.nextLine(); // Consumir a quebra de linha pendente
System.out.print("Digite seu nome completo: ");
String nome = scanner.nextLine();
import java.util.Scanner;
public class ProblemaNextLineSolucao {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
// Solicita a idade
System.out.print("Digite sua idade: ");
int idade = entrada.nextInt();
// Consumir a quebra de linha pendente
scanner.nextLine();
// Solicita o nome
System.out.print("Digite seu nome completo: ");
String nome = entrada.nextLine();
// Exibindo os dados informados
System.out.println("\nDados informados:");
System.out.println("Idade: " + idade + " anos");
System.out.println("Nome: " + nome);
entrada.close();
}
}
Digite sua idade: 25
Digite seu nome completo: Maria Silva
Dados informados:
Idade: 25 anos
Nome: Maria Silva
Vamos criar uma calculadora simples que solicita dois números e a operação desejada:
import java.util.Scanner;
public class CalculadoraSimples {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
// Solicita o primeiro número
System.out.print("Digite o primeiro número: ");
double numero1 = entrada.nextDouble();
// Solicita o segundo número
System.out.print("Digite o segundo número: ");
double numero2 = entrada.nextDouble();
// Consumir a quebra de linha pendente
scanner.nextLine();
// Solicita a operação
System.out.print("Digite a operação desejada (+, -, *, /): ");
String operacao = entrada.nextLine();
// Variável para armazenar o resultado
double resultado = 0;
// Executa a operação conforme solicitado
switch (operacao) {
case "+":
resultado = numero1 + numero2;
break;
case "-":
resultado = numero1 - numero2;
break;
case "*":
resultado = numero1 * numero2;
break;
case "/":
if (numero2 != 0) {
resultado = numero1 / numero2;
} else {
System.out.println("Erro: Divisão por zero não é permitida!");
entrada.close();
return; // Encerra o programa
}
break;
default:
System.out.println("Operação inválida!");
entrada.close();
return; // Encerra o programa
}
// Exibe o resultado
System.out.println("\nResultado:");
System.out.println(numero1 + " " + operacao + " " + numero2 + " = " + resultado);
entrada.close();
}
}
Digite o primeiro número: 10.5
Digite o segundo número: 5.2
Digite a operação desejada (+, -, *, /): +
Resultado:
10.5 + 5.2 = 15.7
Teste seus conhecimentos sobre a classe Scanner:
Reforce o conteúdo desta aula com mais dois exercícios práticos: