Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

6
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. Porém 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 serão preenchidos com os dados que serão capturados da leitura do teclado, mais o método toString() e main(). Listagem 1. Classe Teclado 2. Lendo do teclado com Scanner Agora será criado um método simples para a leitura de dados do teclado, nesse método v ou apresentar também o problema do salto de linhas e algumas formas de resolvê-lo. Veja no método readingOne() Listagem 2 – que o código aparentemente não apresenta problema algum. Listagem 2. Método 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 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) { } } Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a... 1 de 6 01/05/2013 17:46

Transcript of Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

Page 1: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

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 classejava.util.Scanner forneceu uma facilidade nesse quesito. Porém alguns iniciantes no Javaencontram um problema no uso da classe Scanner, que é o salto de linha. Neste tutorialvamos 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 serãopreenchidos com os dados que serão capturados da leitura do teclado, mais o método toString() emain().

Listagem 1. Classe Teclado

2. Lendo do teclado com Scanner

Agora será criado um método simples para a leitura de dados do teclado, nesse método vou apresentartambém o problema do salto de linhas e algumas formas de resolvê-lo. Veja no método readingOne() –Listagem 2 – que o código aparentemente não apresenta problema algum.

Listagem 2. Método readingOne

1234567891011121314151617181920212223242526

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) {

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

1 de 6 01/05/2013 17:46

Page 2: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

também o problema do salto de linhas e algumas formas de resolvê-lo. Veja no método readingOne() –Listagem 2 – que o código aparentemente não apresenta problema algum.

Listagem 2. Método readingOne

O código da Listagem 2 quando for executado vai resultar no problema exibido na Figura 1. Veja namarcação em vermelho que após o “id” ser informado, a linha “first name” não foi digita e sim a linha“surname”. Isso aconteceu porque o método nextInt() da classe Scanner deixa no buffer a instruçãoda tecla pressionada, ou seja, um \n (123456789\n). Como o método nextInt() retorna apenas um valorinteiro, o \n acaba sendo adicionado ao próximo método que é o nextLine(). Assim, o método recebeuma instrução como se o usuário tivesse pressionado o e então pula para a próxima linha.

Figura 1 - Falha no método readingOne()

Uma forma para resolver esse problema é substituir o método nextLine() pelo método next(), como sepode observar na Listagem 3. Desta forma podemos ler perfeitamente as instruções conformedemonstrado na Figura 2.

Listagem 3. Método readingTwo

1234567891011121314151617181920212223242526272829

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

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

2 de 6 01/05/2013 17:46

Page 3: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

pode observar na Listagem 3. Desta forma podemos ler perfeitamente as instruções conformedemonstrado na Figura 2.

Listagem 3. Método readingTwo

Figura 2 - Método readingTwo()

Mas ainda temos um problema, o método next() não permite que se use, por exemplo, o espaço entrepalavras. Se for digitado algo como “João Luiz” o método irá separar o nome “João” de “Luiz”, veja oacontece na Figura 3. Observe que na marcação em vermelho, após ter sido digitado o nome “JoãoLuiz” a linha seguinte foi saltada, indo direto para a próxima linha. Porém, quando foi impresso oobjeto, o nome “Luiz” apareceu no atributo “surname”, o que não deveria ter acontecido.

Figura 3 - Falha ocorrida em readingTwo

1234567891011121314151617181920212223242526272829

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

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

3 de 6 01/05/2013 17:46

Page 4: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

Figura 3 - Falha ocorrida em readingTwo

Uma forma para resolver de vez esse problema do salto de linhas é usar apenas o método nextLine(),mesmo que um atributo não seja do tipo String. Bastaria apenas fazer a conversão de tipos, comodescrito na Listagem 4. Confira na Figura 4 o resultado da execução do método readingThree().

Listagem 4. Usando apenas o nextLine()

1234567891011121314151617181920212223242526272829

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

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

4 de 6 01/05/2013 17:46

Page 5: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

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

1234567891011121314151617181920212223242526272829303132333435363738394041

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

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

5 de 6 01/05/2013 17:46

Page 6: Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java

Saiba mais

Documentação da classe java.util.Scanner hFp://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

} while (option != 0);

}

}

Ler dados do teclado com a classe Scanner | Programando com Java http://mballem.wordpress.com/2012/05/01/ler-dados-do-teclado-com-a...

6 de 6 01/05/2013 17:46