Skip to content

03. Intro a Java

Melissa Diaz edited this page Jan 23, 2025 · 1 revision

Servicios Backend

Un programador backend es responsable de recibir, procesar y almacenar datos en una base de datos. También puede buscar y entregar esos datos en el formato solicitado por el cliente.

backend

JAVA

Java es un lenguaje de programación que fue diseñado bajo el paradigma orientado a objetos, lo que permite:

  • Modelar y representar objetos del mundo real de manera eficiente en código.
  • Organizar y estructurar el código de manera lógica y comprensible.
  • Reutilizar código de manera efectiva.

Entorno Java

entorno java

  • JDK (Java Development Kit): Herramientas para desarrollar, compilar y depurar aplicaciones Java, incluyendo el compilador (Javac) y el JRE.
  • Javac: Compilador de Java que convierte el código fuente en bytecode para ser ejecutado por la JVM.
  • JRE (Java Runtime Environment): Entorno de ejecución que incluye la JVM y las bibliotecas necesarias para ejecutar aplicaciones Java.
  • Java SE (Java Standard Edition): Conjunto de clases y APIs básicas para el desarrollo de aplicaciones Java.
  • JVM (Java Virtual Machine): Máquina virtual que ejecuta el código Java, permitiendo un entorno independiente de la plataforma.
  • GC (Garbage Collector): Gestor automático de memoria que elimina objetos no utilizados para evitar fugas de memoria y mejorar la eficiencia.

Primeros pasos

  • En Java para ejecutar código usamos un método especial que se llama main. Si no existe el método main, no se ejecuta nada.
  • Para el nombre de la clase se usa PascalCase
public class MiPrimerPrograma {
  public static void main(String[] args) {
    // Lo primero que se ejecuta es lo que está dentro de este bloque
    System.out.println("Hola Mundo");
  }
}
  • System.out.println(); -> Imprime en consola.
  • System -> Es una clase que representa al sistema
  • out -> Es otro objeto y es un atributo de la clase System que representa una salida del sistema.
  • println -> Es un método, imprime en una nueva línea en la consola.
  • print -> Imprime en la misma línea.

Note

Al programar en Java, es crucial asignar y almacenar los datos en variables del tipo correcto para garantizar un funcionamiento adecuado.

Para declarar una variable en Java:

int miVariable = 10;
  • int -> tipo de dato.
  • = -> Operador de asignación.
  • ; -> Fin de la sentencia.

Diferencia entre declarar e inicializar

Para declarar una variable en Java, primero se especifica el tipo de dato que va a contener y luego asignarle un nombre.

int numero1;

Para inicializar una variable se usa el operador de asignación y se proporciona un valor que sea compatible con el tipo de dato declarado.

numero1 = 17;

También es posible combinar la declaración e inicialización en una misma línea.

int numero1 = 17;

Variables Vs. Constantes

  • Una constante es un dato al que se le asigna un valor una sola vez y no puede ser modificado posteriormente.
  • Una vez que una constante está inicializada, su valor es inalterable.
  • Para declarar una constante en Java, se utiliza la palabra reservada final y se inicializa en la misma sentencia.
final int NUMERO_15 = 15;
  • Al declarar una constante debemos inicializarla de inmediato.
  • Las variables se escriben en camelCase.
  • Las constantes se escriben en UPPER_CASE..

Tipos de datos

tipos de datos

Datos primitivos

  • Se caracterizan por poder almacenar un único valor.
  • La mayor parte de los tipos estructurados o complejos son composiciones a partir de datos primitivos.
  • Los datos primitivos (8), sirven para gestionar los tipos de información más básicos como números o booleanos.

Numéricos

6 de los datos primitivos, están destinados a facilitar el trabajo con números, se pueden agrupar en dos categorías:

  • Enteros (4): Permiten operar exclusivamente con números enteros, sin parte decimal.
  • Numéricos en punto flotante (2): Contempla números racionales o con parte decimal.
Tipos numéricos enteros
  1. byte: Emplea un sólo byte Tamaño: 1 byte (8 bits). Rango: [-128, 127].

  2. short: Usa el doble de almacenamiento que el anterior. Tamaño: 2 bytes (16 bits). Rango: [-32.768, 32.767].

  3. int: Es el tipo de dato entero más empleado. Tamaño: 4 bytes (32 bits). Rango: [-2.147.483.648, 2.147.483.647] (o -2^31 a 2^31-1).

  4. long: Tipo de entero de mayor tamaño. Tamaño: 8 bytes (64 bits). Rango: [-9.223.372.036.854.775.808, 9.223.372.036.854.775.807] (o -2^63 a 2^63-1).

Tipos numéricos decimales

Permiten representar números tanto muy grandes como muy pequeños, además de números decimales.

  1. float: Conocido como tipo de precisión simple. Soporta hasta 7 números después de la coma.

    • Tamaño: 4 bytes (32 bits).
  2. double: Utiliza un esquema de almacenamiento similar al float, pero con mayor capacidad. Soporta 15 números después de la coma

    • Tamaño: 8 bytes (64 bits).

Note

Mientras que float podría ser adecuado para representar datos con una precisión de hasta dos dígitos decimales, el tipo double ofrece una mayor precisión y un rango de valores más amplio, lo que puede resultar beneficioso en aplicaciones comerciales donde la exactitud de los datos desempeña un papel crucial.

Booleanos y caracteres

boolean

Facilita el trabajo con valores "verdadero/falso". El tipo de datos boolean Sólo acepta true o false,

boolean booleana = true;
boolean booleana = false;
char
  • Se utiliza para almacenar caracteres individuales.
  • Aunque se considera un tipo numérico, su representación habitual es el carácter cuyo código almacena.
  • Utiliza la codificación UTF-16 de Unicode.
  • Debe estar rodeado de comillas simples
char caracter = 'a';

Estructurados

  • Después de los primitivos, todos los demás tipos de datos son objetos, también llamados tipos estructurados o "Clases".
  • Los objetos son instancias de las clases.
  • Se denominan estructurados por que su mayor parte están destinados a contener múltiples valores.
  • Pueden contener valores de tipo primitivo o de tipo objeto.

Cadenas de caracteres

Se declara como:

String nombreCurso = "Iniciación a Java";
  • Las cadenas en Java son un objeto de la clase String, aunque se declaren de este modo.
  • Las cadenas de caracteres se delimitan entre comillas dobles, en lugar de simples como los caracteres individuales.
  • Las cadenas, son objetos que disponen de métodos que permiten operar sobre la información almacenada en dicha cadena.

Arrays

  • Son colecciones de datos de un mismo tipo.
  • Es una estructura de datos en la que a cada elemento le corresponde una posición identificada por uno o más índices numéricos enteros.
  • Es habitual llamar vectores a los arrays de una dimensión y matrices a los arrays que trabajan con dos dimensiones.
  • Los elementos de un array se empiezan a numerar en el 0.

Tipos definidos por el usuario

En Java, existen muchas clases estructuradas creadas por la plataforma o terceros que permiten realizar diversas operaciones. Además, los usuarios pueden crear sus propias clases para tareas específicas, lo que se conoce como tipos estructurados definidos por el usuario.

Envoltorio (Wrapper)

  • Java cuenta con tipos de datos envoltorio para cada tipo primitivo.
  • Estos tipos añaden métodos y propiedades útiles a los primitivos.
  • Facilitan el uso de datos por referencia en lugar de por valor.
  • Los tipos envoltorio son:
    • Byte
    • Short
    • Integer
    • Long
    • Float
    • Double
    • Boolean
    • Character

Note

En Java, las variables que se declaran dentro de un bloque tienen un ámbito limitado a ese bloque en particular. Esto implica que solo son visibles y accesibles dentro de dicho bloque y no se pueden acceder desde fuera de él. Una vez que se sale del bloque, esas variables dejan de existir y no se pueden utilizar.

Operadores en Java

Los operadores en Java son símbolos especiales que se utilizan para realizar operaciones en variables y valores.

Operadores Aritméticos

Son símbolos especiales utilizados para realizar operaciones matemáticas en variables. Incluyen:

Operador Descripción Ejemplo
Adición (+) Suma dos valores. a + b
Sustracción (-) Resta un valor de otro. a - b
Multiplicación (*) Multiplica dos valores. a * b
División (/) Divide un valor por otro. a / b
Módulo (%) Obtiene el residuo de una división. a % b

Operadores de Asignación

Se utilizan para asignar un valor a una variable, combinando la asignación con una operación aritmética o de bits. Los más comunes son:

Operador Descripción Ejemplo
Asignación (=) Asigna un valor a una variable. a = b
Suma y asignación (+=) Suma y luego asigna el valor. a += b
Resta y asignación (-=) Resta y luego asigna el valor. a -= b
Multiplicación y asignación (*=) Multiplica y luego asigna el valor. a *= b
División y asignación (/=) Divide y luego asigna el valor. a /= b
Módulo y asignación (%=) Aplica el módulo y luego asigna el valor. a %= b

Ejemplo:

// Asignación simple
a = b;      
// Suma y asignación
a += b;      // a = a + b
// Resta y asignación
a -= b;      // a = a - b
// ...

Operadores de Incremento y Decremento

Se utilizan para aumentar o disminuir el valor de una variable en una unidad.

Operador Descripción Ejemplo
++ Aumenta el valor de una variable en 1 a++ o ++a
-- Disminuye el valor de una variable en 1 a-- o --a

Operadores Relacionales o de Comparación

Se utilizan para comparar dos valores y producir un resultado booleano que indica si la comparación es verdadera o falsa.

Operador Descripción Ejemplo
Igual a (==) Verifica si dos valores son iguales. a == b
No igual a (!=) Verifica si dos valores no son iguales. a != b
Mayor que (>) Verifica si un valor es mayor que otro. a > b
Menor que (<) Verifica si un valor es menor que otro. a < b
Mayor o igual que (>=) Verifica si un valor es mayor o igual que otro. a >= b
Menor o igual que (<=) Verifica si un valor es menor o igual que otro. a <= b

Operadores Lógicos

Se utilizan para combinar expresiones booleanas y producir un resultado booleano basado en ellas.

Operador Descripción Ejemplo
AND lógico (&&) Devuelve verdadero si ambos operandos son verdaderos. a && b
OR lógico (||) Devuelve verdadero si al menos uno de los operadores es verdadero. a||b
NOT lógico (!) Invierte el valor de verdad del operando. !a

Operador Condicional (Operador Ternario)

Es una expresión condicional que permite tomar decisiones basadas en una condición.

Es una forma concisa y eficiente de escribir expresiones condicionales simples en Java.

Operador Descripción Ejemplo
? : a > b ? a : b (si a es mayor que b, devuelve a, sino devuelve b). a > b ? a : b

Operadores de Bit

Son utilizados para realizar operaciones a nivel de bits en los valores enteros. Estos operadores manipulan los bits individuales de los operandos.

Operador Descripción Ejemplo
AND binario (&) Realiza una operación AND en cada par de bits. a & b
OR binario (|) Realiza una operación OR en cada par de bits. a | b
OR binario (^) Realiza una operación OR en cada par de bits. a ^ b
Complemento binario (~) Invierte todos los bits. ~a
Desplazamiento a la izquierda (<<) Desplaza los bits a la izquierda, rellena con ceros a la derecha. a << 2
Desplazamiento a la derecha (>>) Desplaza los bits a la derecha, rellena con el bit más significativo a la izquierda. a >> 2
Desplazamiento a la derecha sin signo (>>>) Desplaza los bits a la derecha, rellena con ceros a la izquierda. a >>> 2

Definiciones claves

IDE: Integrated development environment. Es el entorno de desarrollo

Compilación: Es un proceso en el que el código fuente escrito en lenguaje Java se traduce a un lenguaje que la computadora pueda entender y ejecutar.

Programa: Es una serie de instrucciones escritas que una computadora puede ejecutar para procesar datos y producir un resultado.

Sentencias: Son unidades mínimas de ejecución en un programa y se componen de reglas gramaticales conocidas como sintaxis.

Sintaxis: define cómo se deben combinar las palabras, los símbolos y los elementos gramaticales para formar instrucciones y expresiones válidas.

Clase: Es una de las unidades básicas más importantes de JAVA como lenguaje de tipo orientado a objeto. Dentro de ella se colocan datos y código del programa que vamos a empezar a codificar.

Paquetes: Nos permite organizar los programas java y empaquetar muchos programas con un mismo fin.

Recursos: Es un objeto que debe ser cerrado después de que el programa finalice.

Clases

Una clase se puede visualizar como un plano o una plantilla que define las características y comportamientos de un objeto.

Al crear una instancia de una clase, se crea un objeto específico basado en esa plantilla.

Las clases System están en un paquete que se descarga por defecto.

Clase Scanner

  • La clase Scanner es utilizada en Java para obtener la entrada del usuario desde la consola.
  • La clase Scanner nos permite solicitar datos al usuario y detener la ejecución del programa hasta que se ingrese la información requerida.

Para usar la clase Scanner, se debe:

// 1. Importarla
import java.util.Scanner;
// 2. Crear una instancia
Scanner miScanner = new Scanner(System.in);

System.in -> Permite la entrada de datos.

Una vez que se tiene una instancia de Scanner, se pueden utilizar sus métodos para leer los datos ingresados por el usuario. Algunos de ellos son:

  • nextBoolean(): Lee un valor booleano (true o false) desde la entrada.
  • nextInt(): Lee un número entero desde la entrada.
  • nextDouble(): Lee un número de tipo double desde la entrada.
  • nextLine(): Lee una línea completa de texto desde la entrada.
  • next() : Lee hasta el primer espacio.

Ejemplo:

Scanner miScanner = new Scanner(System.in);
System.out.print("Ingresa un número entero: ");
int numero = miScanner.nextInt();
System.out.println("El número ingresado es: " + numero);

La clase Scanner puede aceptar varios tipos de argumentos dependiendo de la fuente de datos que se quiera leer:

  1. System.in: Para leer desde la entrada estándar (teclado).

    Scanner miScanner = new Scanner(System.in);
  2. File: Para leer desde un archivo.

    File file = new File("ruta/del/archivo.txt");
    Scanner miScanner = new Scanner(file);
  3. String: Para leer desde una cadena de texto.

    String data = "texto de ejemplo";
    Scanner miScanner = new Scanner(data);

Note

Es importante tener en cuenta que al utilizar la clase Scanner, es una buena práctica cerrar el objeto Scanner una vez que ya no se necesita. Esto se hace mediante la llamada al método close() del objeto Scanner.

En el ejemplo sería: miScanner.close();

La llamada a close() asegura que los recursos asociados con el objeto Scanner sean liberados adecuadamente, lo que contribuye a un mejor manejo de recursos y previene problemas de rendimiento en el programa.

Clase String

  • Es fundamental para representar y manipular cadenas de caracteres.
  • En Java las cadenas de caracteres son tratadas como objeto.
  • Cuenta con una amplia gama de métodos que permiten realizar operaciones.

Métodos de la clase String

  • length(): Devuelve la longitud de la cadena (número de caracteres).

    String texto = "Hola Mundo";
    int longitud = texto.length();  // Devuelve 10
  • charAt(int index): Devuelve el carácter en la posición especificada.

    String texto = "Hola Mundo";
    char primerCaracter = texto.charAt(0);  // Devuelve 'H'
  • substring(int beginIndex, int endIndex): Devuelve una subcadena desde el índice de inicio hasta el índice de fin (excluido).

    String texto = "Hola Mundo";
    String subcadena = texto.substring(5, 10);  // Devuelve "Mundo"
    • substring se puede usar con 1 o 2 parámetros. Cuando se puede usar el mismo método pero pasarle diferentes parámetros se le llama sobrecarga de método.
    • Si se indica un sólo parámetro, toma el valor del índice y retorna los caracteres hasta el final de la cadena.
  • equals(String str): Compara dos cadenas y devuelve true si son iguales.

    String texto1 = "Hola";
    String texto2 = "Hola";
    boolean sonIguales = texto1.equals(texto2);  // Devuelve true
  • indexOf(String str): Devuelve el índice de la primera aparición de una subcadena.

    String texto = "Hola Mundo";
    int indice = texto.indexOf("Mundo");  // Devuelve 5

Otros métodos

Documentación: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

Código con ejemplos y notas: https://github.com/melodiaz23/notas-backend-con-java/blob/master/actividades-java/7_clase-string/Notas.java

Método Descripción
charAt(int index) Devuelve el carácter en la posición específica (índex).
chars() Devuelve una secuencia de valores (IntStream) int que representan los caracteres de la cadena en orden.
codePointAt(int index) Devuelve el punto de código Unicode en la posición especificada.
codePointBefore(int index) Devuelve el punto de código Unicode inmediatamente antes de la posición especificada.
codePointCount(int beginIndex, int endIndex) Devuelve la cantidad de puntos de código Unicode en un subintervalo de esta cadena.
codePoints() Devuelve una secuencia de puntos de código Unicode en la cadena.
compareTo(String anotherString) Compara alfabéticamente esta cadena con otra cadena.
compareToIgnoreCase(String str) Compara lexicográficamente dos cadenas, ignorando las diferencias de mayúsculas y minúsculas.
concat(String str) Concatena la cadena especificada al final de esta cadena.
endsWith(String suffix) Comprueba si esta cadena termina con el sufijo especificado.
equals(Object anObject) Compara esta cadena con el objeto especificado.
equalsIgnoreCase(String anotherString) Compara esta cadena con otra cadena, ignorando las diferencias de mayúsculas y minúsculas.
formatted(Object... args) Formatea la cadena utilizando los argumentos proporcionados.
getBytes(), getBytes(Charset charset), getBytes(String charsetName) Convierte la cadena en una secuencia de bytes utilizando el conjunto de caracteres predeterminado o ingresado por parámetro.
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Copia los caracteres de esta cadena en el array de destino.
isBlank() Devuelve true si la cadena está vacía o contiene solo espacios en blanco.
isEmpty() Devuelve true si la longitud de la cadena es 0.
lastIndexOf(int ch), lastIndexOf(String str), lastIndexOf(int ch, int fromIndex), lastIndexOf(String str, int fromIndex) Devuelve el índice de la última aparición del carácter o cadena especificada, comenzando la búsqueda hacia atrás desde el índice especificado.
length() Devuelve la longitud de esta cadena.
lines() Devuelve una secuencia de líneas de la cadena, separadas por saltos de línea.
matches(String regex) Indica si esta cadena coincide con la expresión regular dada.
offsetByCodePoints(int index, int codePointOffset) Devuelve el índice en esta cadena que es desplazado desde el índice dado por el número de puntos de código.
regionMatches(int toffset, String other, int ooffset, int len) / regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) Prueba si dos regiones de cadenas son iguales.
repeat(int count) Devuelve una cadena cuyo valor es la concatenación de esta cadena repetida count veces.
replace(char oldChar, char newChar), replace(CharSequence target, CharSequence replacement) Devuelve una nueva cadena que resulta de reemplazar todas las apariciones del carácter o la secuencia de caracteres de destino en esta cadena con el carácter o la secuencia de caracteres de reemplazo.
replaceAll(String regex, String replacement) Reemplaza cada subcadena de esta cadena que coincide con la expresión regular dada con la cadena de reemplazo.
replaceFirst(String regex, String replacement) Reemplaza la primera subcadena de esta cadena que coincide con la expresión regular dada con la cadena de reemplazo.

Clase Math

  • Proporciona métodos estáticos para realizar operaciones numéricas comunes y complejas.
  • No se declaran objetos.
  • Es parte del paquete java.lang y no necesita ser importada.

Métodos comunes de la clase Math

  • Math.abs(): Devuelve el valor absoluto de un número.

    int num = -10;
    int absNum = Math.abs(num); // absNum será igual a 10
  • Math.sqrt(): Calcula la raíz cuadrada de un número.

    double num = 16;
    double sqrtNum = Math.sqrt(num); // sqrtNum será igual a 4.0
  • Math.pow(): Calcula la potencia de un número.

    double base = 2;
    double exponente = 3;
    double resultado = Math.pow(base, exponente); // resultado será igual a 8.0
  • Math.random(): Genera un número aleatorio entre 0.0 (inclusive) y 1.0 (exclusivo).

    double randomNum = Math.random(); // Genera un número aleatorio entre 0.0 y 1.0
  • Math.round(): Realiza el redondeo de un número al entero más cercano.

    double num = 3.6;
    long roundedNum = Math.round(num); // roundedNum será igual a 4
  • Math.floor(): Redondea hacia abajo un número decimal al entero más cercano.

    double num = 4.9;
    double flooredNum = Math.floor(num); // flooredNum será igual a 4.0
  • Math.ceil(): Redondea hacia arriba un número decimal al entero más cercano.

  double num = 2.2;
  double ceiledNum = Math.ceil(num); // ceiledNum será igual a 3.0

Otros métodos

Documentación: https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html

Código con ejemplos y notas:

Método Descripción Tipo de Dato
E Constante matemática e, la base del logaritmo natural. double
PI Constante matemática π, la relación entre la circunferencia de un círculo y su diámetro. double
IEEEremainder(double dividendo, double divisor) Calcula el residuo de la división de dos números en formato de punto flotante según la norma IEEE 754. double
abs(int valor) Devuelve el valor absoluto de un número entero. int
absExact(int valor) Devuelve el valor absoluto de un número entero, lanzando una excepción si no se puede representar. int
acos(double angulo) Devuelve el arcocoseno de un número en formato de punto flotante. double
addExact(int a, int b) Devuelve la suma de dos números enteros, lanzando una excepción si no se puede representar. int
asin(double angulo) Devuelve el arcoseno de un número en formato de punto flotante. double
atan(double angulo) Devuelve el arcotangente de un número en formato de punto flotante. double
atan2(double y, double x) Devuelve el arcotangente del cociente de dos números en formato de punto flotante. double
cbrt(double valor) Devuelve la raíz cúbica de un número en formato de punto flotante. double
ceil(double valor) Redondea hacia arriba un número en formato de punto flotante al entero más cercano. double
class Devuelve el objeto Class que representa la clase de la instancia actual. Class<?>
copySign(double magnitud, double signo) Devuelve un número con la magnitud del primer parámetro y el signo del segundo parámetro. double
cos(double angulo) Devuelve el coseno de un ángulo en formato de punto flotante. double
cosh(double angulo) Devuelve el coseno hiperbólico de un número en formato de punto flotante. double
decrementExact(int valor) Resta 1 a un número entero, lanzando una excepción si no se puede representar. int
exp(double valor) Devuelve el valor de e elevado a la potencia de un número. double
expm1(double valor) Devuelve el valor de e elevado a la potencia de un número, menos 1. double
floor(double valor) Redondea hacia abajo un número en formato de punto flotante al entero más cercano. double
floorDiv(int dividendo, int divisor) Realiza la división entera de dos números enteros y redondea hacia abajo. int
floorMod(int dividendo, int divisor) Calcula el módulo de dos números enteros y redondea hacia abajo. int
fma(double a, double b, double c) Realiza una multiplicación y suma precisa de tres números. double
getExponent(double valor) Devuelve el exponente de un número en formato de punto flotante. int
hypot(double cateto1, double cateto2) Calcula la hipotenusa de un triángulo rectángulo dados los dos catetos. double
incrementExact(int valor) Suma 1 a un número entero, lanzando una excepción si no se puede representar. int
log(double valor) Calcula el logaritmo natural de un número en formato de punto flotante. double
log10(double valor) Calcula el logaritmo en base 10 de un número en formato de punto flotante. double
log1p(double valor) Calcula el logaritmo natural de (1 + valor) con precisión para valores cercanos a 0. double
max(int a, int b) Devuelve el valor máximo entre dos números enteros. int
min(int a, int b) Devuelve el valor mínimo entre dos números enteros. int
multiplyExact(int a, int b) Multiplica dos números enteros, lanzando una excepción si no se puede representar el resultado. int
multiplyFull(int a, int b) Multiplica dos números enteros y devuelve los 64 bits de más peso del resultado. long
multiplyHigh(int a, int b) Multiplica dos números enteros y devuelve los 32 bits de más peso del resultado. int
negateExact(int valor) Cambia el signo de un número entero, lanzando una excepción si no se puede representar. int
nextAfter(double start, double direction) Devuelve el número más cercano al primer parámetro en la dirección del segundo parámetro. double
nextDown(double valor) Devuelve el número más cercano al valor especificado, menor que dicho valor. double
nextUp(double valor) Devuelve el número más cercano al valor especificado, mayor que dicho valor. double
pow(double base, double exponente) Calcula la potencia de un número en formato de punto flotante. double
random() Genera un número pseudoaleatorio entre 0.0 (incluido) y 1.0 (excluido). double
rint(double valor) Redondea un número en formato de punto flotante al entero más cercano. double
round(float valor) Redondea un número en formato de punto flotante al entero más cercano. int
round(double valor) Redondea un número en formato de punto flotante al entero más cercano. long
scalb(double valor, int escala) Escala un número en formato de punto flotante según una potencia de 2 especificada. double
signum(double valor) Devuelve el signo de un número en formato de punto flotante. double
sin(double angulo) Devuelve el seno de un ángulo en formato de punto flotante. double
sinh(double angulo) Devuelve el seno hiperbólico de un número en formato de punto flotante. double
sqrt(double valor) Calcula la raíz cuadrada de un número en formato de punto flotante. double
subtractExact(int a, int b) Resta dos números enteros, lanzando una excepción si no se puede representar el resultado. int
tan(double angulo) Devuelve la tangente de un ángulo en formato de punto flotante. double
tanh(double angulo) Devuelve la tangente hiperbólica de un número en formato de punto flotante. double
toDegrees(double anguloRad) Convierte un ángulo en radianes a grados. double
toIntExact(long valor) Convierte un número largo a un entero, lanzando una excepción si no se puede representar. int
toRadians(double anguloDeg) Convierte un ángulo en grados a radianes. double
ulp(double valor) Devuelve la unidad de menor magnitud en el rango del valor especificado. double

Clase Arrays

Es parte del paquete java.util, proporciona métodos estáticos que permiten manipular, copiar, ordenar, buscar y comparar arreglos.

Arrays.sort()

  • Ordena un arreglo en orden ascendente.
  • Aplica a tipos primitivos y objetos que implementen la interfaz Comparable.
int[] arr = {1, 5, 2, 6, 3, 7};
Arrays.sort(arr); // El arreglo ahora está ordenado

Arrays.binarySearch()

  • Realiza una búsqueda binaria en un arreglo ordenado.
  • Devuelve el índice del valor si se encuentra, o un valor negativo si no está presente.
int[] arr = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(arr, 3); // Devuelve 2 (índice de 3)

💡 Nota: La búsqueda binaria es eficiente, pero requiere que los objetos implementen Comparable.

Arrays.equals()

  • Compara dos arreglos para verificar si tienen los mismos elementos en las mismas posiciones.
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean isEqual = Arrays.equals(arr1, arr2); // Devuelve true

Arrays.fill()

  • Llena todos los elementos de un arreglo con un valor específico.
int[] arr = new int[5];
Arrays.fill(arr, 1); // Todos los elementos ahora son 1

Arrays.copyOf() y Arrays.copyOfRange()

  • Copian un arreglo o una parte de él en un nuevo arreglo.
int[] original = {1, 2, 3, 4, 5};
int[] copia = Arrays.copyOf(original, original.length); // Copia completa
int[] parteDeUnaCopia = Arrays.copyOfRange(original, 1, 3); //Crea una copia de una parte del arreglo original (índices 1 a 2 - El tercer parámetro no es inclusivo)

Arrays.toString()

  • Convierte un arreglo en una cadena legible, útil para depuración.
int[] arr = {1, 2, 3};
System.out.println(Arrays.toString(arr)); // Imprime "[1, 2, 3]"

Arrays.asList()

  • Convierte un arreglo en una lista (List), lo que permite manipularlo usando métodos de la interfaz List.

Clase Wrappers

Son clases que mapean un tipo de dato primitivo dentro de un objeto. Cada tipo de dato primitivo cuenta con una clase envolvente o "wrapper" que encapsula dicho tipo de dato primitivo en un objeto.

Las clases "wrapper" correspondientes a cada tipo de dato primitivo, son

Tipo Primitivo Clase Wrapper
boolean Boolean
char Character
int Integer
double Double
byte Byte
short Short
long Long
float Float

Las clases wrapper permiten que los tipos primitivos se comporten como objetos, proporcionando métodos adicionales para realizar operaciones útiles.

Boolean

Método Descripción
toString() Devuelve un objeto String que representa el valor de este booleano.
Boolean.valueOf(String s) Devuelve un objeto Boolean dependiendo del string ingresado por parámetro. Si s es igual a "true" (ignorando mayúsculas y minúsculas), devuelve true, sino devuelve false.
booleanValue() Devuelve el valor booleano del objeto Boolean.

Character

Método Descripción
toString() Devuelve un objeto String que representa el valor de esta variable de tipo Character.
compareTo(Character anotherCharacter) Compara numéricamente con anotherCharacter, devuelve 0 si son iguales, -1 si es menor numéricamente, y 1 si es mayor.
Character.valueOf(String s) Devuelve un objeto Character basado en el valor del string ingresado por parámetro.
Character.getNumericValue(char ch) Devuelve el valor int que representa el carácter Unicode especificado por parámetro.
Character.getType(char ch) Devuelve un valor que indica la categoría general del carácter ch.
Character.isLetter(char ch) Determina si el carácter especificado es una letra.
Character.isWhitespace(char ch) Determina si el carácter especificado es un espacio en blanco.

Integer

Método Descripción
toString() Devuelve un objeto String que representa el valor de este Integer.
compareTo(Integer anotherInteger) Compara numéricamente con anotherInteger, devuelve 0 si son iguales, -1 si es menor numéricamente, y 1 si es mayor.
Integer.valueOf(String s) Devuelve un objeto Integer dependiendo del string ingresado por parámetro.
Integer.MAX_VALUE Una constante que contiene el valor máximo que puede tener un int ($2^{31}-1$).
Integer.MIN_VALUE Una constante que contiene el valor mínimo que puede tener un int ($-2^{31}$).

Double

Método Descripción
toString() Devuelve un objeto String que representa el valor de este Double.
compareTo(Double anotherDouble) Compara numéricamente con anotherDouble, devuelve 0 si son iguales, -1 si es menor numéricamente, y 1 si es mayor.
Double.valueOf(String s) Devuelve un objeto Double dependiendo del string ingresado por parámetro.
Double.MAX_VALUE Una constante que contiene el mayor valor finito positivo de tipo double, $(2-2^{-52})\times2^{1023}$.
Double.MIN_VALUE Una constante que contiene el menor valor positivo distinto de cero de tipo double, $2^{-1074}$.
doubleValue() Devuelve el valor primitivo double correspondiente a este Double.

Estructuras de Control

Son mecanismos que permiten controlar el flujo de ejecución de un programa.

También permiten manejar excepciones y controlar situaciones inesperadas durante la ejecución del programa.

if

El if es una estructura de control condicional que nos permite ejecutar un bloque de código si se cumple una condición determinada.

public static void main(String[] args){
	// Sentencias que se ejecutan antes del if
	if (condicion){
	// Sentencias que se ejecutan si la condición es verdadera
	}	
	// Sentencias que se ejecutan después del "if"
}

if-else

Permite ejecutar un bloque de código si se cumple una condición determinada, y otro bloque
código si la condición no se cumple.

public static void main(String[] args){
	// Sentencias que se ejecutan antes del if else
	if (condicion){
	// Sentencias que se ejecutan si la condición es verdadera
	} else {
	// Sentencias que se ejecutan si la condición es falsa.
	}	
	
	// Sentencias que se ejecutan después del "if"
}

if-else-if

permite ejecutar un bloque de código si se cumple una condición determinada y otro bloque de código sólo si se cumple otra condición.

public static void main(String[] args){
	// Sentencias que se ejecutan antes del if else if
	if (condicion1){
	// Sentencias que se ejecutan si la condición es verdadera
	} else if (condicion2){
	// Sentencias que se ejecutan si la condición1 es falsa y la condicion2 es verdadera.
	}	
	
	// Sentencias que se ejecutan después del "if"
}

Después de la llave de cierre del bloque "else if (condicion2)", podemos agregar otro bloque "else" o "else if (condicion)" tantas veces como queramos.

switch

Permite seleccionar uno de varios bloques de código para ejecutar, dependiendo del valor de una expresión o variable.

La expresión dentro del switch se evalúa y se compara con los casos definidos dentro de él. Cada caso representa una opción diferente, y se ejecutará el bloque de código correspondiente si el valor de la expresión coincide con el caso.

public static void main(String[] args) {
//Sentencias que se ejecutan antes del "switch".
	switch (opcion) {
		case 1:
		case 2:
			//Sentencias que se ejecutan si "opción" tiene el "valor 1 o 2".
			System.out.println("Seleccionaste la opción 1 o 2");
			break;
		case 3:
			//Sentencias que se ejecutan si "opción" tiene el "valor 3".
			System.out.println("Seleccionaste la opción 3");
			break;
		default:
			//Sentencias que se ejecutan si "opción" no coincide con el
			valor de ningún "case".
			System.out.println("Opción inválida");
			break;
	}
//Sentencias que se ejecutan después del "switch".
}

Sin el break, el código continua ejecutando los casos siguientes, incluso si no coinciden con el valor de la expresión.

Switch expression

Otra forma mejorada de utilizar el switch introducida en Java 12. Permite evaluar diferentes tipos de datos, incluyendo cadenas de texto (strings), y utilizar expresiones más complejas.

public static void main(String[] args) {
    // Sentencias que se ejecutan antes del "switch".
    switch (opcion) {
      case 1 -> System.out.println("Seleccionaste la opción 1");
      case 2 -> System.out.println("Seleccionaste la opción 2");
      case 3 -> System.out.println("Seleccionaste la opción 3");
      default -> System.out.println("Opción inválida");
    }
    // Sentencias que se ejecutan después del "switch".
  }
  • Switch expressions no requieren el uso de la palabra break.
  • Si se requiere incluir varias líneas de código se utilizan llaves { }.

El switch como expresión es un nuevo enfoque que permite que el switch funcione como una expresión.

Con el switch como expresión, podemos asignar directamente el resultado del switch a la variable, sin necesidad de declararla previamente:

public static void main(String[] args) {
    String mes = "February";
    int numeroDeDias = switch (month) {
      case "February" -> 28;
      case "April", "June", "September", "November" -> 30;
      case "January", "March", "May", "July", "August", "October", "December" -> 31;
      default -> 0;
    };
    System.out.println(mes+" tiene "+numeroDeDias+" días.");
    }

Las expresiones permiten retornar un valor.

yield

Al utilizar bloques de código en una expresión switch para manejar múltiples líneas de código, se emplea la palabra clave yield para indicar el valor de retorno del case.

public static void main(String[] args) {
    String position = "director";
    boolean alcanzoObjetivos = true;
    double bonus = switch (position) {
      case "temporal" -> 50;
      case "empleado" -> 1000;
      case "director" -> {
        double bonusBase = 2000;
        double bonusPorRendimiento = alcanzoObjetivos ? 500 : 0;
        double bonusTotal = bonusBase + bonusPorRendimiento;
        yield bonusTotal;
        }
      default -> 0;
      };
      System.out.println("El bonus del "+position+" es $"+bonus);
    }

Note

Si se conocen de antemano todos los valores que puede tomar una variable, es necesario tener un case correspondiente para cada uno de ellos. En caso de no conocer todos los posibles valores, es recomendable incluir una cláusula default para manejar cualquier valor no previsto.

Jump statements

Java soporta tres sentencias de salto:

  • Break:

    • Termina una secuencia en una declaración switch.
    • Sale de un bucle.
  • Continue:

    • Fuerza una iteración anticipada de un bucle, saltando el resto del código y pasando a la siguiente.
  • Return:

    • Termina explícitamente la ejecución de un método y, opcionalmente, devolviendo un valor.

Try Catch

Es un mecanismo que nos permite lidiar con situaciones anómalas que pueden ocurrir durante la ejecución de un programa.

Es importante porque:

  • Brinda robustez: Se gestionan situaciones inesperadas sin que colapsen de manera abrupta.
  • Control de flujo: Permite dirigir el flujo del programa incluso en presencia de errores.
  • Depuración y calidad del código: Facilita la identificación y corrección de errores.

Note

Al utilizar el bloque try-catch, el programa salta las líneas de código dentro del bloque try cuando se encuentra con una línea que produce un error. En lugar de detenerse, continúa ejecutando el programa a partir del bloque catch, permitiendo que las líneas de código restantes se ejecuten después del bloque.

Ejemplo:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Clase {
  public static void main(String[] args) {
    try {
      Scanner pepe = new Scanner(System.in);
      System.out.print("Ingrese un divisor: ");
      int numero = pepe.nextInt();// Posible entrada inválida
      String palabra = "hola";
      double resultado = 10 / numero;// Posible división por cero
      System.out.println("El resultado es: " + resultado);
    } catch (ArithmeticException e) {
      System.out.println("Error: División por cero.");
    } catch (InputMismatchException e) {
      System.out.println("Error: Se detectó un valor inválido ingresado por teclado.");
    } catch (Exception e) {
      System.out.println("Error: Ups!");
    }
  }
}

InputMismatchException -> ocurre cuando se produce un error al intentar convertir la entrada del usuario. Exception -> Permite atrapar cualquier excepción adicional no especificada. Va al final de todos los bloques catch.

La variable e permite acceder a ciertos métodos que pueden ser utilizados, como:

  • printStackTrace() -> Imprime por consola la pila de llamadas de la excepción, mostrando el lugar exacto donde ocurrió el problema.
  • getMessage() -> Devuelve el mensaje de descripción del error.

Excepciones Comunes en Java

  • NullPointerException: Se produce al intentar acceder a un objeto que tiene un valor null. Por ejemplo, cuando se llama a un método o se accede a un atributo de un objeto no inicializado.

  • ArrayIndexOutOfBoundsException: Ocurre al intentar acceder a un índice fuera del rango válido de un array, como un índice negativo o mayor que el tamaño del array.

  • ArithmeticException: Se lanza al realizar una operación aritmética inválida, como dividir por cero.

  • NumberFormatException: Se produce al intentar convertir una cadena a un tipo numérico, pero el formato de la cadena no es válido.

  • FileNotFoundException: Ocurre al intentar acceder a un archivo que no existe en el sistema de archivos.

  • IOException: Excepción genérica que se lanza cuando ocurre un error de entrada/salida durante la lectura o escritura de datos.

    • Si no se puede abrir o leer un archivo.
    • Si falla una operación de escritura en un archivo.
    • Si hay una interrupción en la red al comunicarse con un servidor.
  • ClassNotFoundException: Se lanza cuando se intenta cargar dinámicamente una clase que no se encuentra en el classpath.

    • El classpath es la ubicación que la JVM utiliza para buscar las clases que no forman parte de las bibliotecas estándar.
  • InterruptedException: Ocurre cuando un hilo en ejecución es interrumpido por otro hilo mientras está esperando, durmiendo o realizando una operación de bloqueo.

    • Por ejemplo, si un usuario quiere cancelar una tarea larga (como un cálculo intensivo o una descarga), sin necesidad de esperar a que termine.
  • Todos los tipos de excepciones: https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/Exception.html

Bucles

Es una estructura de control que permite ejecutar un bloque de código repetidamente un número específico de veces.

Existen tres tipos principales de bucles en Java:

Bucle for

Combina la inicialización, la condición y el incremento (o decremento) en una sola línea.

Es muy útil cuando sabemos exactamente cuántas veces queremos repetir una operación.

Tiene 3 partes:

  • Inicialización: es donde se inicializa la variable de control del bucle. En la mayoría de los casos, esta variable se denomina "i".
for (int i = 0; ... ) {
	//Código del bucle
}

int i = 0; inicializa la variable i con el valor 0.

  • Condición: Esta es la condición que se verifica antes de cada iteración del bucle. Si la condición es verdadera (“true”), se ejecuta el bloque de código dentro del bucle. Si es falsa (“false”), el bucle se detiene.
for (... ; i < 5; ... ) {
	//Código del bucle
}

i < 5 es la condición. Por lo tanto, mientras el valor de i sea menor que 5, el bloque de código del bucle continuará ejecutándose.

  • Actualización: Se actualiza la variable de control. En la mayoría de los casos, simplemente se incrementa o decrementa la variable.
for (... ; ... ; i++) {
	//Código del bucle
}

i++ incrementa el valor de "i" en 1 en cada iteración del bucle.

El bucle for completo sería:

public static void main(String[] args) {
	for (int i = 0; i < 5; i++) {
		System.out.println("El valor de i es: " + i);
	}
}

Imprimirá los números del 0 al 4 en la consola. Después de cada iteración, "i" se incrementa en uno (i++), y mientras "i" sea menor que 5 (i < 5), el bucle continuará. Cuando "i" llegue a 5, la condición "i < 5" será falsa y el bucle se detendrá.

for each

Se utiliza para recorrer elementos en arreglos o colecciones sin tener que lidiar con índices.

public static void main(String[] args) {
	int[] arr = {1, 2, 3, 4, 5};
	for (int num : arr) {
		System.out.println("El valor es: " + num);
	}
}

La variable num toma cada valor en el arreglo arr en cada iteración del bucle, lo que simplifica el proceso de iterar a través del arreglo sin necesidad de utilizar un índice.

Bucle while

Ejecuta un bloque de código mientras una condición especificada sea verdadera. La condición se evalúa antes de cada iteración.

Si la condición es falsa desde el principio, el bloque de código dentro del bucle no se ejecutará ni una sola vez.

Note

El bucle "while" se utiliza cuando se desea repetir un bloque de código siempre que una condición sea verdadera.

Dentro del bloque de código del bucle "while", generalmente se debe incluir algún mecanismo para cambiar la condición y eventualmente hacer que sea falsa.

public static void main(String[] args) {
    int numeroAleatorio = 0;
    while (numeroAleatorio < 8) {
      numeroAleatorio = (int) (Math.random() * (10 - 0 + 1) + 0);
    }
    System.out.println("Seguro es 8 o mayor a 8: " + numeroAleatorio);
  }

El bloque de código se ejecuta mientras numeroAleatorio sea menor que, y en cada iteración del bucle, el valor de numeroAleatorio cambia.

Bucle do-while

La condición se evalúa después de que se ha ejecutado el bloque de código. Por lo tanto, el bloque de código se ejecutará al menos una vez, incluso si la condición es falsa desde el principio.

El flujo del do-while consiste en:

  1. Se ejecuta el bloque de código dentro del "do".
  2. Se evalúa la condición especificada después del "while".
  3. Si la condición es verdadera, el bloque de código se ejecuta nuevamente.
  4. Si es falsa, el bucle termina y la ejecución continúa después del bucle.
public static void main(String[] args) {
    Scanner pepe = new Scanner(System.in);
    int num;
    do {
      System.out.print("Por favor, ingrese un número mayor a 0: ");
      num = pepe.nextInt();
    } while (num <= 0);
    System.out.println("Ingresaste: " + num);
  }

El programa solicita al usuario que ingrese un número, si el número es menor o igual a 0, el programa seguirá solicitando al usuario que ingrese otro número. Esto continuará hasta que el usuario ingrese un número mayor que 0.

Recurso: https://ioflood.com/blog/do-while-loop-java/

Arrays

  • Es una estructura de datos que permite almacenar una colección de elementos, ya sean valores o variables.
  • Son objetos y se instancian a partir de una clase predefinida en el lenguaje.
  • Tienen una longitud fija.

Para declarar un array:

public static void main(String[] args) {
	int numero = 6;
	int[] array1 = {1,numero,2,3}; //array1 es un objeto de la clase int[]
	int[] array2 = new int[4]; //array2 es un objeto de la clase int[]
}
  • Al utilizar llaves, inicializamos el array con los valores o variables que deseamos almacenar.
  • Al utilizar el operador "new", especificamos el nombre de la clase (en este caso int[]) y el tamaño del array.

Es posible acceder y modificar los elementos de un array utilizando su índice.

public static void main(String[] args) {
	String[] arr = new String[3];
	arr[0] = "hola"; // Modifica el primer elemento del arreglo
	System.out.println(arr[0]); // Accede al primer elemento del
	arreglo
	System.out.println(arr.length); // Imprime: 3
}

Note

Todos los elementos en un array de Java deben ser del mismo tipo.

for i y Arrays

public static void main(String[] args) {
	String[] paises =  {"Uruguay","Argentina","Brasil","Venezuela"};
	for (int i = 0; i < paises.length ; i++) {
		System.out.println(paises[i]);
	}
}

Metodos

Son bloques de código que realizan una tarea específica y pueden ser llamados desde otras partes del programa o de otros programas.

Un método toma datos de entrada (parámetros) y realiza operaciones con esos datos, devolviendo un resultado. En POO los métodos son una forma de expresar el comportamiento de los objetos.

Los métodos representan funcionalidades más pequeñas y específicas dentro de un programa.

Permiten:

  • Reutilizar código
  • Abstracción -> Encapsular la complejidad en métodos.
  • Organización

Componentes de un método

metodo sin retorno

  • El método no tiene valor de retorno, se declara como tipo de dato void.

metodo con retorno

El método no tiene un valor de retorno, se declara que devuelve un tipo de dato String.

  1. Modificador de Acceso:

    • Utiliza el modificador de acceso: public, private, protected, default.
  2. Modificador de Invocación:

    • El modificador static permite invocar el método desde main.

Note

Dentro de un contexto estático sólo se pueden llamar métodos estáticos o acceder a variables estáticas. Esto se debe a que el contexto estático pertenece a la clase en sí misma, no a una instancia de la clase.

  • Los métodos y variables no estáticos dependen de una instancia específica de la clase.
  • Los métodos estáticos existen a nivel de clase y pueden ser llamados sin crear una instancia.
  1. Tipo de Dato:

    • Indica el tipo de dato que el método devuelve:
      • void: el método no devuelve ningún valor.
      • String: el método retorna una cadena de texto.
  2. Nombre:

    • Es el identificador del método, siguiendo la convención camelCase.
  3. Parámetros:

    • Se definen entre paréntesis y representan los valores esperados por el método. Si no se necesitan, se colocan paréntesis vacíos.
  4. Cuerpo:

    • Contiene el código a ejecutar, delimitado por llaves { }.
  5. Retorno:

    • Es el valor que el método devuelve, debe coincidir con el tipo de dato especificado. Se usa la palabra clave return, excepto en métodos void.

Sobrecarga de Métodos

La sobrecarga de métodos permite utilizar el mismo nombre de método con distintos conjuntos de parámetros. Esto brinda flexibilidad, permitiendo implementar funcionalidades similares que pueden recibir diferentes tipos o cantidades de argumentos.

Ejemplo:

public class Calculadora {
    // Método suma con dos parámetros enteros
    public int sumar(int a, int b) {
        return a + b;
    }
   // Sobrecarga del método suma con tres parámetros enteros
    public int sumar(int a, int b, int c) {
        return a + b + c;
    }

    // Sobrecarga del método suma con dos parámetros de tipo double
    public double sumar(double a, double b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        Calculadora calc = new Calculadora();
        System.out.println(calc.sumar(5, 10)); // Salida: 15
        System.out.println(calc.sumar(5, 10, 15)); // Salida: 30
        System.out.println(calc.sumar(5.5, 10.3)); // Salida: 15.8
    }
}

Variables globales vs por parámetros

Existen dos formas comunes de compartir variables entre métodos:

  1. Pasar variables por parámetro: se envían directamente al método que las necesita.
  2. Declararlas como variables globales de la clase: permiten ser utilizadas en cualquier método de la clase sin necesidad de pasarlas como parámetro.

Parámetros en Java

En Java, los parámetros pueden pasarse por valor o por referencia, lo que afecta cómo se manipulan en los métodos:

  • Por Valor: Los tipos primitivos (como int, double) y String se pasan por valor. Esto significa que se crea una copia de la variable y cualquier cambio en esta copia no afecta a la variable original.

  • Por Referencia: Los objetos y tipos no primitivos (arrays, clases personalizadas) se pasan por referencia, es decir, se pasa la dirección en memoria del objeto. Las modificaciones en el objeto dentro del método afectan al objeto original.

Diferencia entre Parámetros y Argumentos en Java

Parámetro Argumento
Declarado en la firma de un método o función. Valor real pasado al método o función durante la llamada.
Recibe datos para el método o función en su invocación. Es el dato concreto que se proporciona al método o función.
Definido en la declaración del método con su tipo y nombre. Pasado durante la llamada al método; debe coincidir en tipo y cantidad con los parámetros.
Permite al método trabajar con información externa. Pueden ser constantes, variables o expresiones evaluadas antes de pasarse.

Note

Los parámetros son variables en la definición del método; los argumentos son los valores que se envían cuando se llama al método.

Debugger

El término "debugger" se utiliza para referirse a una herramienta o proceso que se emplea en la detección, análisis y corrección de errores en el código de un programa. Su funcionamiento se basa en detener el programa en puntos específicos (“breakpoints”) definidos por el programador, lo cual le permite realizar las evaluaciones necesarias.

Es importante porque:

  • Proporciona la capacidad de localizar errores en nuestro código de manera eficiente.
  • Permite comprender en detalle cómo fluye la ejecución del programa.
  • Permite examinar y modificar el estado del programa en tiempo real, lo que ofrece una comprensión acerca de cómo evolucionan nuestras variables y objetos a lo largo de la ejecución

Breakpoints

Son marcadores que se colocan en el código para detener la ejecución en un punto específico. Cuando se alcanza el punto de interrupción, el debugger pausa la ejecución y brinda la oportunidad de examinar el estado de las variables, analizar el flujo del programa y realizar modificaciones si es necesario.

Pasos de depuración:

debugger

  • Continue: Permite reanudar la ejecución del programa después de detenerse en un punto de interrupción.

  • Step Over: Avanza al siguiente punto de interrupción o línea de código. Si hay una llamada a un método, el depurador ejecuta el método sin entrar en él. Ideal para avanzar sin inspeccionar detalles internos de los métodos.

  • Step Into: Avanza al siguiente punto de interrupción o línea de código, pero si encuentra una llamada a un método, ingresa en él y se detiene en su primera instrucción. Útil para analizar el contenido de los métodos.

  • Step Out: Continua la ejecución hasta salir del método actual. Útil para volver rápidamente a la línea que invocó el método sin recorrer el resto del método actual.

  • Restart: Reinicia la ejecución desde el principio, recargando archivos y restableciendo variables. Ideal para empezar la depuración de nuevo y verificar si los cambios resuelven el problema.

  • Stop: Finaliza completamente la ejecución y depuración del programa. Se utiliza para detener la depuración antes de la finalización natural del programa.

  • Hot Code Replace: Permite recargar el código para aplicar cambios en tiempo real sin reiniciar el programa. Útil para probar modificaciones rápidas y observar resultados inmediatos.

Funcionalidades de Depuración

  • Watch y Expresiones: La herramienta "Watch" permite monitorear y evaluar valores específicos mientras el programa se ejecuta. Es posible observar tanto variables como expresiones, proporcionando información detallada sobre el estado del programa.

  • Inspección de la Pila de Llamadas: Permite analizar el flujo del programa al mostrar los métodos invocados y el orden de las llamadas, lo que ayuda a identificar la causa de errores y comportamientos inesperados.

  • Control de Flujo de Excepciones:

    • Uncaught Exceptions -> Detiene la ejecución en excepciones no capturadas (sin try-catch), mostrando detalles para investigar y corregir errores en el código.
    • Caught Exceptions -> Detiene la ejecución en excepciones capturadas dentro de bloques try-catch, permitiendo analizar su manejo.

Clone this wiki locally