Método
| Método | Qué lee | Cuándo se detiene | Ejemplo |
|---|---|---|---|
| next() | Lee una palabra (sin espacios) | Se detiene cuando encuentra un espacio o enter | Si escribes Santiago José, solo leerá Santiago. |
| nextLine() | Lee toda la línea completa (con espacios incluidos) | Se detiene cuando encuentra un enter | Si 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) |