Você está na página 1de 6

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

Ler dados do teclado com a classe Scanner


Existem diversas classes no Java que permitem a leitura de dados vindos do teclado e a partir do Java 5 a classe java.util.Scanner forneceu uma facilidade nesse quesito. Porm alguns iniciantes no Java encontram um problema no uso da classe Scanner, que o salto de linha. Neste tutorial vamos ver como resolver esse pequeno problema. 1. Criando a classe Teclado Para iniciar o tutorial vamos criar a classe Teclado Listagem 1 com alguns atributos que sero preenchidos com os dados que sero capturados da leitura do teclado, mais o mtodo toString() e main(). Listagem 1. Classe Teclado 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.wp.mballem.lerteclado; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Teclado { private long id; private String firstName; private String surname; private int age; @Override public String toString() { return "Teclado{" + "id=" + id + ", firstName='" + firstName + '\'' + ", surname='" + surname + '\'' + ", age=" + age + '}' + "\n"; } public static void main(String[] args) { } } 2. Lendo do teclado com Scanner Agora ser criado um mtodo simples para a leitura de dados do teclado, nesse mtodo vou apresentar tambm o problema do salto de linhas e algumas formas de resolv-lo. Veja no mtodo readingOne() Listagem 2 que o cdigo aparentemente no apresenta problema algum.
1 de 6 01/05/2013 17:46

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

tambm o problema do salto de linhas e algumas formas de resolv-lo. Veja no mtodo readingOne() Listagem 2 que o cdigo aparentemente no apresenta problema algum. Listagem 2. Mtodo readingOne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.wp.mballem.lerteclado; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Teclado { //atributos e toString() omitidos nesta listagem public static void main(String[] args) { readingOne(); } private static void readingOne() { Scanner scanner = new Scanner(System.in); Teclado t = new Teclado(); System.out.print("Enter your id: "); t.id = scanner.nextInt(); System.out.print("Enter your first name: "); t.firstName = scanner.nextLine(); System.out.print("Enter your last name: "); t.surname = scanner.nextLine(); System.out.print("Enter your age: "); t.age = scanner.nextInt(); System.out.println(t.toString()); } } O cdigo da Listagem 2 quando for executado vai resultar no problema exibido na Figura 1. Veja na marcao em vermelho que aps o id ser informado, a linha rst name no foi digita e sim a linha surname. Isso aconteceu porque o mtodo nextInt() da classe Scanner deixa no buer a instruo da tecla pressionada, ou seja, um \n (123456789\n). Como o mtodo nextInt() retorna apenas um valor inteiro, o \n acaba sendo adicionado ao prximo mtodo que o nextLine(). Assim, o mtodo recebe uma instruo como se o usurio tivesse pressionado o e ento pula para a prxima linha.

Figura 1 - Falha no mtodo readingOne() Uma forma para resolver esse problema substituir o mtodo nextLine() pelo mtodo next(), como se pode observar na Listagem 3. Desta forma podemos ler perfeitamente as instrues conforme demonstrado na Figura 2.
2 de 6 01/05/2013 17:46

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

pode observar na Listagem 3. Desta forma podemos ler perfeitamente as instrues conforme demonstrado na Figura 2. Listagem 3. Mtodo readingTwo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.wp.mballem.lerteclado; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Teclado { //atributos e toString() omitidos nesta listagem public static void main(String[] args) { readingTwo(); } private static void readingTwo() { Scanner scanner = new Scanner(System.in); Teclado t = new Teclado(); System.out.print("Enter your id: "); t.id = scanner.nextInt(); System.out.print("Enter your first name: "); t.firstName = scanner.next(); System.out.print("Enter your last name: "); t.surname = scanner.next(); System.out.print("Enter your age: "); t.age = scanner.nextInt(); System.out.println(t.toString()); } }

Figura 2 - Mtodo readingTwo() Mas ainda temos um problema, o mtodo next() no permite que se use, por exemplo, o espao entre palavras. Se for digitado algo como Joo Luiz o mtodo ir separar o nome Joo de Luiz, veja o acontece na Figura 3. Observe que na marcao em vermelho, aps ter sido digitado o nome Joo Luiz a linha seguinte foi saltada, indo direto para a prxima linha. Porm, quando foi impresso o objeto, o nome Luiz apareceu no atributo surname, o que no deveria ter acontecido.

3 de 6

Figura 3 - Falha ocorrida em readingTwo

01/05/2013 17:46

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

Figura 3 - Falha ocorrida em readingTwo Uma forma para resolver de vez esse problema do salto de linhas usar apenas o mtodo nextLine(), mesmo que um atributo no seja do tipo String. Bastaria apenas fazer a converso de tipos, como descrito na Listagem 4. Conra na Figura 4 o resultado da execuo do mtodo readingThree(). Listagem 4. Usando apenas o nextLine() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.wp.mballem.lerteclado; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Teclado { //atributos e toString() omitidos nesta listagem public static void main(String[] args) { readingThree(); } private static void readingThree() { Scanner scanner = new Scanner(System.in); Teclado t = new Teclado(); System.out.print("Enter your id: "); t.id = Long.parseLong(scanner.nextLine()); System.out.print("Enter your first name: "); t.firstName = scanner.nextLine(); System.out.print("Enter your last name: "); t.surname = scanner.nextLine(); System.out.print("Enter your age: "); t.age = Integer.parseInt(scanner.nextLine()); System.out.println(t.toString()); } }

4 de 6

01/05/2013 17:46

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

Figura 4 - Problemas resolvidos Voc pode agora criar um menu pelo teclado, como exemplo veja a Listagem 5. Listagem 5. Criando um menu com a classe Scanner 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package com.wp.mballem.lerteclado; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Teclado { //atributos e toString() omitidos nesta listagem public static void main(String[] args) { readingMenu(); } private static void readingMenu() { Scanner scanner = new Scanner(System.in); Teclado t; List<Teclado> list = new ArrayList<Teclado>(); int option = 0; do { System.out.println("1. Add User"); System.out.println("2. Print Users"); System.out.println("0. Exit"); System.out.print("> "); option = Integer.parseInt(scanner.nextLine()); if (option == 1) { t = new Teclado(); System.out.print("Enter your id: "); t.id = Long.parseLong(scanner.nextLine()); System.out.print("Enter your first name: "); t.firstName = scanner.nextLine(); System.out.print("Enter your last name: "); t.surname = scanner.nextLine(); System.out.print("Enter your age: "); t.age = Integer.parseInt(scanner.nextLine()); list.add(t); } else if (option == 2) { System.out.println(list.toString()); } } while (option != 0); } }
01/05/2013 17:46

5 de 6

Ler dados do teclado com a classe Scanner | Programando com Java

http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

} while (option != 0); } } Saiba mais Documentao da classe java.util.Scanner hFp://docs.oracle.com/javase/1.5.0/docs/api/java/util /Scanner.html

6 de 6

01/05/2013 17:46