Recebendo dados do usuário: a classe Scanner

Até o presente momento definimos as variáveis no momento em que estávamos programando.

Mas e se quiséssemos obter essa informação do usuário?
Por exemplo, para perguntar a idade ou para criar uma calculadora? Iríamos depender do que fosse digitado.

Usaremos a classe Scanner para receber esses dados.

Importando (import) classes (class) e pacotes (packages)

Existem milhares de funcionalidades no Java. Essas classes foram agrupadas em pacotes, os packages.
E pacotes para a mesma funcionalidade são chamados de API (Application Programming Interface). Por exemplo, temos uma seção sobre a API Java 2D, para fazer desenhos em 2D.
Ou seja, são uma série de pacotes para desenhar.

Porém, todos esses pacotes não estão simplesmente prontos para serem utilizados, pois são muitos.
Inclusive, você pode criar (e vai) os seus pacotes, pode baixar, reutilizar, compartilhar, vender etc.
Se todos estes estivessem prontos para utilização, demoraria MUITO para rodar um programa em Java.

Qual a solução então?
Vamos dizer ao Java quais funcionalidades queremos usar. Pra isso, usamos a função 'import':
import pacote_que_voce_quer_importar;

Por exemplo: para usar print, printf e println, não precisa dizer nada ao Java.
São métodos tão comuns que podem ser usadas automaticamente em qualquer aplicação.
Esses métodos fazem parte de um pacote chamado 'java.lang'.


Recebendo dados do usuário: new Scanner(System.in)

Para receber dados do usuário, temos que usar a classe Scanner, que faz parte do pacote 'java.util'.
Vamos dizer ao Java que usaremos essa classe na nossa aplicação
Para isso, adicione essa linha no começo do programa:
import java.util.Scanner;

Bom, temos a classe. Vamos declarar o nosso objeto do tipo Scanner.
Vamos chamá-lo de 'entrada'. Sua declaração é feita da seguinte maneira:
Scanner entrada = new Scanner(System.in);

Pronto, o objeto 'entrada' será usado para ler entradas do sistema.

Lembre-se que há uma forte tipagem por trás dos panos. Ou seja, o Java está lidando com bytes, blocos de memória e outras coisas mais complicadas.
Então, para ele, há muita diferença entre inteiros, float, doubles e outros tipos. Portanto, precisamos ser bem claros quanto a isso.

Assim, a nossa entrada será bem tipada. Vamos iniciar por inteiros.
Para receber um número inteiro do usuário, com nosso objeto 'entrada', usaremos a seguinte sintaxe:
inteiro = entrada.nextInt();

Explicações dadas, vamos ver a coisa funcionando. Esse é um exemplo bem simples que pergunta a idade do usuário, espera ele digitar (e dar enter) e exibe essa mensagem na tela:

import java.util.Scanner;
        
public class Entrada {

    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int idade;
        
        System.out.println("Digite sua idade: ");
        idade = entrada.nextInt();
        
        System.out.printf("Sua idade é " + idade + "\n");
        
    }
}

Mas isso de 'qual sua idade?...19...você tem 19 anos', é meio tele-tubbie.
Você é programador Java, vulgo Paladino das Artes Computacionais.
O seguinte programa usa uma função que obtém o ano atual (do computador do usuário) e calcula o ano que o usuário nasceu, que é algo mais útil que repetir o que você acabou de digitar.

Para isso, usaremos a classe 'Calendar', que tem métodos para trabalharmos com dias, horas, dias da semana, minutos, segundos, anos etc.
Para saber mais sobre, acesse a documentação:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html

Pra usar a 'Calendar', é necessário importar:
import java.util.Calendar;

Usaremos o método get(Calendar.YEAR), que retorna um inteiro com o ano, e vamos armazenar esse inteiro em uma variável 'ano'.

Então, nosso programa fica assim:

import java.util.Scanner;
import java.util.Calendar;

public class Entrada {

    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        int idade;
        int ano_atual;
        int ano_nascimento

        // pergunta a idade e armazena
        System.out.println("Digite sua idade: ");
        idade = entrada.nextInt();
       
        //Criando um objeto do tipo Calendar, o 'calendario' e armazenando o ano atual
        Calendar calendario = Calendar.getInstance();
        ano_atual=calendario.get(Calendar.YEAR);
        ano_nascimento= ano_atual - idade;
       
        System.out.printf("Você nasceu em " + ano_nascimento + "\n");
       
    }
}

O ano de nascimento é calculado e armazenado através da operação de subtração:
ano_nascimento = ano_atual - idade;

Você aprenderá outras operações matemáticas em breve.
Aqui vale uma ressalva.

Eu fiz assim por ser um tutorial básico e por questão de organização, mas a variável 'ano_nascimento' não seria necessária.
Poderíamos ter usado '(ano_atual - idade)' direto no printf assim:

System.out.printf("Você nasceu em " + (ano_atual - idade) + "\n");

Mas tem que ser entre parênteses.
Assim você não precisa mais da variável 'ano_nascimento'.

Aliás, também não precisaríamos da variável 'ano_atual', poderíamos ter feito diretamente assim:
System.out.printf("Você nasceu em " + ( calendario.get(Calendar.YEAR) - idade) + "\n");

Quer saber? Esqueça da variável 'idade', faça só:

import java.util.Scanner;
import java.util.Calendar;

public class Entrada {

    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        
        System.out.println("Digite sua idade: ");
        Calendar calendario = Calendar.getInstance();
        
        System.out.printf("Você nasceu em " + (calendario.get(Calendar.YEAR) - entrada.nextInt()) + "\n");
        
    }
}

Notou como fomos tirando as variáveis e foi ficando cada vez menor?
Cada vez que tiramos, o programa fica menor e ocupa menos espaço.

Porém perde em legibilidade. Note que agora está mais difícil de entender o que fizemos.
Com 'idade', 'ano_atual' e 'ano_nascimento' fica bem mais organizado.

Não existe um método ou jeito melhor de se fazer as coisas. Programar é algo pessoal.
Você terá que encontrar um meio termo entre eficiência (programa rápido e ocupado pouco espaço), mas que seja de fácil entendimento por outros usuários (e por você no futuro). Pois se escrever de forma muito compacta e complicada, pode ser que nem você entenda o que fez futuro.

Recebendo outros tipos de dados, float: nextFloat();

No exemplo anterior, usamos o tipo inteiro.
Se você for perspicaz notará o 'Int' de 'nextInt()'.

Sim, pra float, será 'nextFloat':

import java.util.Scanner;

public class Entrada {

    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        float preco;
     
        System.out.println("Quanto custa algo em uma loja de R$ 1,99? ");
        preco = entrada.nextFloat();
     
        System.out.println("Hã? " + preco + "?");
     
    }
}

Programa bobo ,não?
Não. É uma pegadinha. Digite 1,99 pra você ver.
O certo é 1.99 ;)


Exercício:
Crie um aplicativo que pergunte o ano de nascimento e diga a idade atual do indivíduo.
Use a classe Calendar e o método get(Calendar.YEAR) desta classe.



PS:  não chame o usuário de indivíduo

PS2: Poderá existir alguns problemas no cálculo de sua idade
1. Por conta do mês que você faz aniversário.
Isso será resolvido deixando o problema mais completo, perguntando o mês e dia do aniversário e usando testes condicionais, que aprenderemos mais adiante.

2. Se o usuário não digitar um número, ou digitar negativo ou outro absurdo.
Nesse momento você sentirá vontade de chamar ele de indivíduo, energúmeno e outras coisas.
Mas se acostume.

Existe uma coisa chamada tratamento de erros e exceções, muito usada justamente pra tentar imaginar os possíveis erros e exceções que podem ocorrer.
No caso, exceções, é o nome bonito que se dá aos absurdos que os usuários podem digitar.

Por exemplo, você já deve ter visto em cadastros:
Insira sua data de nascimento na forma dd/mm/aaaa:

Aí o usuário vai e digita 5/janeiro/89 e não sabe qual foi o erro.
Experimente agora digitar algo que não seja um número em seus programas.

Para saber mais sobre a relação de de usuários x programadores visite:
http://www.vidadesuporte.com.br
http://www.vidadeprogramador.com.br

Vídeo-aula sobre a classe Scanner:

Para assistir a vídeo-aula ministrada pela Universidade XTI sobre o assunto abordado nesse artigo, clique aqui.



Apostila de Java para download

Dicas e Novidades de Java por e-mail

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.