Saltar a contenido

1.2 Práctica con el lenguaje

Estructura de un programa Java

// 1. Paquete e importaciones
import java.util.Scanner;

// 2. Clase (el archivo se llama igual: Saludo.java)
public class Saludo {

    // 3. Punto de entrada
    public static void main(String[] args) {
        System.out.println("Hola, Java");
    }
}

Todo el código vive dentro de una clase. La ejecución empieza en public static void main(String[] args). Las sentencias terminan en ; y los bloques van entre { }.

Variables

int edad = 20;
double altura = 1.68;
boolean activo = true;
char letra = 'A';
String nombre = "Ana";
var ciudad = "Cádiz";   // inferencia de tipo local (Java 10+)

Una variable debe declararse con tipo y asignarse antes de usarse.

Constantes: final

final double IVA = 0.21;
// IVA = 0.10;  // error de compilación

Por convención, las constantes se escriben en MAYÚSCULAS. A nivel de clase suelen ser public static final.

Literales

42 (int), 42L (long), 3.14 (double), 3.14f (float), 'a' (char), "hola" (String), true (boolean).

Operadores

public class Operadores {
    public static void main(String[] args) {
        System.out.println(7 + 2);   // 9
        System.out.println(7 / 2);   // 3   (int / int = división entera)
        System.out.println(7 / 2.0); // 3.5
        System.out.println(7 % 2);   // 1
        System.out.println(3 > 2 && 2 > 1); // true
        int x = 5;
        x += 2;                      // 7
        x++;                         // 8
        System.out.println(x);
    }
}

Grupos: aritméticos (+ - * / %), relacionales (== != < > <= >=), lógicos (&& || !), asignación (= += -= ++ --) y ternario (cond ? a : b).

Cadenas: usa equals

== compara referencias. Para comparar el contenido de dos String se usa a.equals(b).

Entrada y salida

import java.util.Scanner;

public class Entrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        System.out.print("¿Cómo te llamas? ");
        String nombre = teclado.nextLine();
        System.out.println("Hola, " + nombre);
        System.out.printf("Tienes %d años%n", 20);
    }
}

Leer números y otros tipos

Scanner tiene un método para cada tipo (nextInt(), nextDouble()...), pero tiene dos trampas que dan problemas a casi todo el mundo (más abajo). Por eso lo más seguro es leer siempre la línea entera con nextLine() y convertirla después:

Quiero leer… Cómo se escribe Tipo que queda
Un texto String texto = teclado.nextLine(); String
Un entero int n = Integer.parseInt(teclado.nextLine()); int
Un decimal double d = Double.parseDouble(teclado.nextLine()); double
Un sí/no boolean acepta = teclado.nextLine().trim().equalsIgnoreCase("s"); boolean
Varios números en una línea int a = teclado.nextInt(); int b = teclado.nextInt(); int

Los cuatro primeros, en un programa:

import java.util.Scanner;

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

        System.out.println("Edad:");
        int edad = Integer.parseInt(teclado.nextLine());              // int
        System.out.println("Altura en metros:");
        double altura = Double.parseDouble(teclado.nextLine());       // double
        System.out.println("Nombre:");
        String nombre = teclado.nextLine();                           // String
        System.out.println("¿Aceptas las condiciones? (s/n):");
        boolean acepta = teclado.nextLine().trim().equalsIgnoreCase("s");   // boolean

        System.out.println(nombre + " tiene " + edad + " años y mide " + altura + " m");
        System.out.println("El año que viene tendrá " + (edad + 1));
        System.out.println("Acepta: " + acepta);
    }
}

Con esta entrada: 17, 1.75, Ana y s (una por línea).

Edad:
Altura en metros:
Nombre:
¿Aceptas las condiciones? (s/n):
Ana tiene 17 años y mide 1.75 m
El año que viene tendrá 18
Acepta: true

Trampa 1: nextInt() y después nextLine()

nextInt() lee el número pero deja sin leer el salto de línea que escribiste después. Si a continuación usas nextLine(), lee lo que queda de esa línea: nada.

Con este programa y la entrada 17 y Ana:

import java.util.Scanner;

public class Entrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        int edad = teclado.nextInt();
        String nombre = teclado.nextLine();      // lee lo que QUEDA de la línea del 17: nada
        System.out.println("Edad: " + edad + " | Nombre: [" + nombre + "]");
    }
}
Edad: 17 | Nombre: []

El nombre sale vacío. Leyendo la línea entera y convirtiendo, se arregla:

import java.util.Scanner;

public class Entrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        int edad = Integer.parseInt(teclado.nextLine());   // se lee la línea ENTERA y se convierte
        String nombre = teclado.nextLine();
        System.out.println("Edad: " + edad + " | Nombre: [" + nombre + "]");
    }
}
Edad: 17 | Nombre: [Ana]

Trampa 2: nextDouble() depende del idioma del equipo

nextDouble() usa la configuración regional. En un equipo con idioma español, espera la coma (1,75) y falla con el punto (1.75); en uno configurado en inglés espera el punto. Estos son los resultados reales con el idioma del equipo en español:

import java.util.Scanner;

public class Entrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        double altura = teclado.nextDouble();
        System.out.println("Altura: " + altura);
    }
}

Con 1.75:

Exception in thread "main" java.util.InputMismatchException

Con 1,75 (coma) sí funciona:

Altura: 1.75

Para que el programa se comporte igual en cualquier equipo, se lee la línea y se usa Double.parseDouble, que siempre espera el punto:

import java.util.Scanner;

public class Entrada {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        double altura = Double.parseDouble(teclado.nextLine());   // siempre con punto, sea cual sea el idioma del equipo
        System.out.println("Altura: " + altura);
    }
}

Con 1.75:

Altura: 1.75

Si escriben otra cosa

Integer.parseInt("abc") lanza NumberFormatException, y nextInt() lanza InputMismatchException. Cómo controlarlas con try/catch está en 1.3 Tipos de datos.

Las salidas de esta sección se han obtenido ejecutando cada programa con Java y la entrada indicada.

Comentarios

// Comentario de una línea
/* Comentario
   de varias líneas */
/** Comentario Javadoc: genera documentación */

Crear un proyecto y usar el IDE

IDEs habituales: IntelliJ IDEA, Eclipse, NetBeans y VS Code (con Extension Pack for Java). Para proyectos con dependencias se usa Maven o Gradle.