Scanner

⌨️ Leer entrada del usuario con Scanner

En este tutorial voy a enseñarles cómo leer la entrada del usuario.

En Java usamos la clase Scanner, que está en:

java.util

import java.util.Scanner;

🧩 Crear un Scanner

Cuando creamos un Scanner, debemos decirle de dónde leerá datos.

Para leer desde la terminal usamos:

System.in

import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
    }
}

📌 System.in → entrada (teclado)

📌 System.out → salida (pantalla)

🔢 Leer un número (ejemplo con edad)

Muchos métodos del Scanner empiezan con next...:

  • nextByte()
  • nextInt()
  • nextDouble()
  • nextLine()
import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        byte edad = scanner.nextByte();
        System.out.println("Tú tienes " + edad + " años");
    }
}

📌 Aquí Java convierte edad a texto automáticamente cuando concatenamos.

🏷️ Poner una etiqueta al usuario

Primero mostramos un mensaje, luego leemos:

🏷️ Poner una etiqueta al usuario

import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Pon tu edad: ");
        byte edad = scanner.nextByte();
        System.out.println("Tú tienes " + edad + " años");
    }
}

⚠️ println baja a la siguiente línea.

⚠️ Si el tipo no coincide, sale una excepción

Si el usuario escribe 20.1 y tú usas nextByte(), falla.

✅ Si quieres decimales, usa:

  • nextFloat()
  • nextDouble()

🧾 Leer texto: next() vs nextLine()

Para leer texto tenemos dos opciones:

next() → lee un token

(se detiene en espacios)

import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Pon tu nombre: ");
        String nombre = scanner.next();
        System.out.println("Tú te llamas " + nombre);
    }
}

Si escribes Danna Cruz, solo toma Danna.

nextLine() → lee la línea completa

import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Pon tu nombre completo: ");
        String nombre = scanner.nextLine();
        System.out.println("Tú te llamas " + nombre);
    }
}

Aquí sí toma Danna Cruz completo.

🧼 Quitar espacios con trim()

Si el usuario pone espacios al inicio o al final, se ven raros.

Solución: trim():

import java.util.Scanner;

public class Type1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Pon tu nombre completo: ");
        String nombre = scanner.nextLine().trim();
        System.out.println("Tú te llamas " + nombre);
    }
}

📌 Esto es encadenamiento de métodos: nextLine().trim()

⚡ Mini-ejemplo aplicado: exponentes con Math.pow

import java.util.Scanner;

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

        System.out.print("Ingresa la base: ");
        double base = scanner.nextDouble();

        System.out.print("Ingresa el exponente: ");
        double exponente = scanner.nextDouble();

        double resultado = Math.pow(base, exponente);

        System.out.println(base + " elevado a la " + exponente + " es: " + resultado);

        scanner.close();
    }
}

⚠️ Bug clásico: nextInt()/nextDouble() + nextLine()

Este error pasa MUCHO:

Lees un número con nextInt() o nextDouble()
y luego intentas leer texto con nextLine()

pero nextLine() parece “saltarse” la entrada 😵

🤔 ¿Por qué pasa?

Porque cuando escribes un número y presionas Enter:

✅ el número se lee
⚠️ pero queda el salto de línea \n en el buffer

Entonces nextLine() lee ese Enter pendiente y devuelve una línea vacía.

✅ Solución: “limpiar” con un nextLine() extra

import java.util.Scanner;

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

        System.out.print("Edad: ");
        int edad = scanner.nextInt();

        scanner.nextLine(); // 👈 limpia el Enter pendiente

        System.out.print("Nombre completo: ");
        String nombre = scanner.nextLine();

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

        scanner.close();
    }
}

✅ Ahora sí funciona perfecto: lee el número y luego la línea completa.