Páginas

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)