Páginas

Mostrando entradas con la etiqueta scanner. Mostrar todas las entradas
Mostrando entradas con la etiqueta scanner. Mostrar todas las entradas

next() vs nextLine()

Método


MétodoQué leeCuándo se detieneEjemplo
next()Lee una palabra (sin espacios)Se detiene cuando encuentra un espacio o enterSi escribes Santiago José, solo leerá Santiago.
nextLine()Lee toda la línea completa (con espacios incluidos)Se detiene cuando encuentra un enterSi escribes Santiago José, leerá Santiago José.

Entonces:

    
Scanner sc = new Scanner(System.in);

System.out.print("Nombre: ");
String nombre = sc.next(); // Lee solo una palabra

System.out.print("Nombre completo: ");
String nombreCompleto = sc.nextLine(); // Lee toda la línea
       
    

Si tú escribes:

    
Santiago José
    
  • next() → toma solo “Santiago”
  • nextLine() → toma “Santiago José”

El problema con los valores en blanco (el famoso "salto fantasma")

Sucede cuando mezclas next() y nextLine(). next(), nextInt(), nextDouble(), etc. dejan un enter pendiente en el buffer del teclado.

Por Ejemplo:

    
System.out.print("Edad: ");
int edad = sc.nextInt();  // usuario escribe: 25 + ENTER

System.out.print("Nombre: ");
String nombre = sc.nextLine(); // ¡problema!
    

Aquí el nextLine() lee el ENTER pendiente del nextInt(), y por eso parece que “salta” la lectura (nombre queda vacío).

Solución:

Después de usar nextInt(), nextDouble(), o next(), consume el ENTER antes de usar nextLine():

    
System.out.print("Edad: ");
int edad = sc.nextInt();
sc.nextLine(); // <- limpia el buffer

System.out.print("Nombre completo: ");
String nombre = sc.nextLine(); // ahora sí funciona bien
    

¿Qué significa “tener cuidado con los valores en blanco o los búferes”?

  • Buffer: una especie de “memoria temporal” donde se guardan los datos que escribes antes de que el programa los lea.
  • Si el buffer tiene un ENTER pendiente, nextLine() lo toma como una línea vacía.
  • Por eso se dice “ten cuidado con los valores en blanco”, porque pueden venir de ese ENTER que quedó “guardado”.

Ejemplo limpiando buffer:

codigo con buffer:

    
        import java.util.Scanner; 
        public class Mavenproject2 { 
            public static void main(String[] args) { 
                Scanner sc = new Scanner(System.in); 
                String nombre,nombreCompleto; 
                System.out.print("Nombre: "); 

                nombre = sc.next(); // Lee solo una palabra 

                System.out.println("Nombre completo: "); 
                nombreCompleto = sc.nextLine(); // Lee toda la línea 
                System.out.println("los nombres son"); 
                System.out.println(nombre); 
                System.out.println(nombreCompleto); 
                sc.close(); 
    

Como se Arregla?

Cuando escribes JUAN SEBAS y presionas Enter:

  • next() lee solo "JUAN".
  • El espacio y el ENTER (\n) quedan en el buffer.

Entonces, cuando llega a esta línea:

nombreCompleto = sc.nextLine();

El nextLine() lee ese ENTER pendiente, y por eso no te pide escribir nada nuevo. Por eso parece que se “salta” la lectura y te deja nombreCompleto vacío.

Solución:

Tienes que limpiar el buffer antes de usar nextLine():

codigo sin buffer:

    
import java.util.Scanner;

public class Mavenproject2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String nombre, nombreCompleto;

        System.out.print("Nombre: ");
        nombre = sc.next(); // Lee solo una palabra (hasta espacio)

        sc.nextLine(); // <- Limpia el ENTER pendiente del buffer

        System.out.print("Nombre completo: ");
        nombreCompleto = sc.nextLine(); // Lee toda la línea

        System.out.println("Los nombres son:");
        System.out.println(nombre);
        System.out.println(nombreCompleto);

        sc.close();
    }
}
    

RESULTADO:

    
Nombre: JUAN
Nombre completo: JUAN SEBAS
    

La clave es esa línea:

 sc.nextLine(); // limpia el buffer

¿Cuándo aparece el problema?

El problema del "salto fantasma" solo pasa cuando mezclas distintos métodos del Scanner, por ejemplo:

  • nextInt() → deja un salto de línea pendiente.
  • next() → deja el ENTER pendiente después de la palabra.

Pero si usas solo nextLine(), no hay nada que limpiar.

ejemplo:

    
import java.util.Scanner;
public class Mavenproject2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String nombre, nombreCompleto;

        System.out.print("Nombre: ");
        nombre = sc.nextLine();

        System.out.print("Nombre completo: ");
        nombreCompleto = sc.nextLine();

        System.out.println("Los nombres son:");
        System.out.println(nombre);
        System.out.println(nombreCompleto);

        sc.close();
    }
}

    

Resumen:

Situación¿Necesita limpiar el buffer (sc.nextLine() extra)?
Solo usas nextLine()❌ No
nextLine()✅ Sí
Quieres saltarte una línea intencionalmente✅ Sí (opcional)

Cómo importar la clase Scanner en Java

Cómo importar la clase Scanner en Java

Para poder usar la clase Scanner en Java, primero es necesario importarla desde el paquete java.util. Esto se hace al inicio del archivo fuente, antes de la definición de la clase.

Importar la clase Scanner

import java.util.Scanner;

Con esta instrucción, ya puedes crear objetos de tipo Scanner dentro de tu programa.

Ejemplo básico

import java.util.Scanner;

public class EjemploScanner {
    public static void main(String[] args) {
        // Crear un objeto Scanner que lee desde teclado (System.in)
        Scanner sc = new Scanner(System.in);

        System.out.print("Escribe tu nombre: ");
        String nombre = sc.nextLine();

        System.out.print("Escribe tu edad: ");
        int edad = sc.nextInt();

        System.out.println("Hola " + nombre + ", tienes " + edad + " años.");

        sc.close(); // cerrar el scanner
    }
}

Otras formas de importar

  • import java.util.*; Importa todas las clases del paquete java.util, incluyendo Scanner. Ejemplo:
    import java.util.*;
    Scanner sc = new Scanner(System.in);
  • Usar el nombre completo de la clase sin importación:
    java.util.Scanner sc = new java.util.Scanner(System.in);
    Esto evita escribir import, pero hace el código menos limpio.

Recomendación

La forma más común y recomendada es usar:

import java.util.Scanner;

De esta manera el código es más claro y fácil de leer.