Ler Dados Do Teclado Com a Classe Scanner _ Programando Com Java
Transcript of 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
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
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
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
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
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