Formación informática

Java | Joomla | MySQL

Curso de Java – Tema 14: clase Scanner

Detalle de un teclado retroiluminado

¿Qué es?

Es una clase de Java de tipo final que nos permite que un usuario externo a nuestra aplicación inserte datos necesarios para la ejecución de nuestro programa. Por ejemplo, pedir al usuario un número necesario para calcular alguna fórmula, los datos personales de una persona…

Para acceder a su definición oficial en la API de Java 8 tenemos que pulsar sobre este enlace. Está disponible a partir de la versión 5 de Java.

Funcionamiento

Cuando se introducen caracteres por teclado, el objeto Scanner toma toda la cadena introducida y la divide en elementos llamados tokens. El carácter predeterminado que sirve de separador de tokens es el espacio en blanco.

Por ejemplo, si introducimos la frase “Luka Doncic, número 1 del draft 2018.”, Scanner divide la cadena en los siguientes tokens:

Luka
Doncic,
número 1
del
draft
2018.

Si introducimos la cadena “13 69.131 Jesús h”, los tokens que se crean son:

13
69.131
esús
H

Utilizando los métodos que proporciona la clase Scanner se puede acceder a esos tokens y trabajar con ellos en nuestra aplicación.

¿Cómo se usa?

Primero, importamos la clase. Esto se escribe en la parte superior, a continuación del nombre del paquete

import java.util.Scanner;

Creamos un objeto de la clase Scanner llamado, por ejemplo, teclado, bien como variable local para un método de una clase bien como variable de instancia para todos los métodos de la clase:

Scanner teclado = new Scanner (System.in);
static Scanner teclado = new Scanner (System.in);

Mediante esta instanciación hemos creado el objeto teclado y lo hemos asociado al teclado usando el método System.in. Una vez hecho esto, se puede leer datos por teclado.

Después de haber usado la clase, hay que cerrar el objeto. Tenemos dos opciones:

  1. Hasta la version había que usar el método close() para finalizar manualmente el escaner. El código era este
Scanner teclado = null;
try {
    teclado = new Scanner(System.in)
    System.out.println("introduzca un numero");
    numero = teclado.nextInt();
    //resto del código del método main...
} catch (Exception e) {
    //manejar la excepción
} finally {
    if (teclado!= null) {
        teclado.close();
    }
}
  1. A partir de la version 7 es mucho más sencillo realizando un tratamiento de excepciones try con resources:
try (Scanner input = new Scanner(System.in)) {
    System.out.println("introduzca un numero");
    numero = input.nextInt();
    //resto del código del método main...
}

Métodos

Ahora que hemos creado el objeto ya podemos usar los métodos que tiene la clase. Lo que más nos importa son los métodos next para cada uno de los tipos de dato existentes que usamos en las variables. Por ejemplo: nextInt(), nextDouble(), nextLine()… hay una para cada tipo de dato primitivo.

int nombre_variable = teclado.nextInt();
String nombre_variable = teclado.nextLine();
Double nombre_variable = teclado.nextDouble();

Los métodos más usados son estos:

METODO

DESCRIPCIÓN

nextXxx()

Devuelve el siguiente token como un tipo básico. Xxx es el tipo. Por ejemplo, nextInt() para leer un entero, nextDouble para leer un double, etc.

next()

Devuelve el siguiente token como un String.

nextLine()

Devuelve la línea entera como un String. Elimina el final \n del buffer

hasNext()

Devuelve un boolean. Indica si existe o no un siguiente token para leer.

hasNextXxx()

Devuelve un boolean. Indica si existe o no un siguiente token del tipo especificado en Xxx, por ejemplo hasNextDouble()

useDelimiter(String)

Establece un nuevo delimitador de token.

Cómo limpiar el buffer de entrada en Java

Cuando en una aplicación se leen por teclado datos numéricos y datos de tipo carácter o String debemos tener en cuenta que al introducir los datos y pulsar intro estamos también introduciendo en el buffer de entrada el intro. Es decir, cuando introducimos datos y pulsamos el intro como final de entrada, el carácter intro también pasa al buffer de entrada. Por lo tanto, si en el buffer de entrada se introduce un 69, lo que realmente se está introduciendo es 69\n.

En esta situación, la instrucción:

n = sc.nextInt();

Asigna a n el valor 69 pero el intro permanece en el buffer. Es decir, en el buffer de entrada después de leer el entero queda la secuencia de escape \n, equivalente al retorno de carro. Si ahora se pide que se introduzca por teclado una cadena de caracteres, el método nextLine() extrae del buffer de entrada todos los caracteres hasta llegar a un intro y elimina el intro del buffer.

En este caso asigna una cadena vacía a la variable nombre y limpia el intro. Esto provoca que el programa no funcione correctamente, ya que no se detiene para que se introduzca el nombre.

Una solución consiste en limpiar el buffer de entrada si se van a leer datos de tipo carácter a continuación de la lectura de datos numéricos. La forma más sencilla de limpiar el buffer de entrada en Java es ejecutar la instrucción. En el caso de tener que introducir números y cadenas de texto, primero introducimos los números y a continuación las cadenas de texto:

sc.nextLine();

Otra forma de evitar este problema es leer todos los valores con el método nextLine() que nos limpia el retorno del carro realizando la conversión oportuna al tipo de dato de la variable usando los métodos parse de la clase envolvente de cada tipo de datos:

tipo_dato variable = clase_envolvente.parseTipoDato(teclado.nextline());
int opcion = Integer.parseInt(teclado.nextLine());
double precio = Double.parseDouble(teclado.nextLine());

Otra posible solución es usar el método skip de la clase Scanner para forzar a Java que se salte el retorno de carro que provocaría el error:

teclado.skip(“\n”);

1.6. Tratamiento de excepciones

Hay que tener en cuenta que si no se pone un dato correcto nos saltará una excepción InputMismatchException, debiendo hacer un tratamiento adecuado de ella.

Curso de Java – Tema 13: Clase JavaBeans <- | -> Curso de Java – Tema 15: clase BufferedReader
Curso de Java - Índice ejercicios nivel básico

Escribir un comentario

Aunque los comentarios no expresan la opinión del administrador del sitio web, éste si que tiene una responsabilidad legal sobre lo que aparece. Por lo tanto, habrá una labor de moderación de los mensajes. No se permitirán mensajes ofensivos ni publicidad


Código de seguridad
Refescar

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-Ley 13/2012, de 30 de marzo. Si continúa navegando consideramos que acepta el uso de cookies. . Más información