AFF Education Construa seu Futuro

Aula 17 - Classe Scanner

Classe Scanner

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:

  1. Importar a classe no início do programa: import java.util.Scanner;
  2. Criar um objeto Scanner: Scanner scanner = new Scanner(System.in);
  3. Usar os métodos do Scanner para ler diferentes tipos de dados

Scanner

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

Scanner

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

nextLine(), nextInt(), e nextDouble()

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

Problema comum: nextLine() após nextInt() ou nextDouble()

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();

Versão corrigida do exemplo anterior

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

Exemplo prático: calculadora simples

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

Exercícios

Teste seus conhecimentos sobre a classe Scanner:

1. Qual importação é necessária para usar a classe Scanner em um programa Java?

2. Como se cria um objeto Scanner para ler entrada do teclado?

3. Qual método do Scanner é usado para ler uma linha inteira de texto?

4. O que acontece quando chamamos nextLine() logo após nextInt()?

5. Complete o código abaixo para ler um número decimal digitado pelo usuário:

import java.util.Scanner;

public class LeituraDecimal {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Digite um número decimal: ");
        double numero = ____________________;
        
        System.out.println("Número digitado: " + numero);
        
        scanner.close();
    }
}

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Qual método do Scanner lê um número inteiro digitado pelo usuário?

2. Antes de usar o Scanner, é necessário: