1. Introducción
Empecemos con una pregunta: ¿para qué debe un método devolver algo? ¿Por qué no hacer todo dentro del método y simplemente imprimir el resultado en pantalla?
La cuestión es que a menudo no necesitamos solo realizar alguna acción, sino obtener un resultado que luego será útil en otras partes del programa. Por ejemplo:
- Un método calcula la suma de dos números y la devuelve para que podamos usar el resultado en cálculos posteriores.
- Un método determina si un número es par y devuelve true o false, para que podamos tomar una decisión.
- Un método devuelve una cadena de saludo para el usuario, y nosotros decidimos adónde enviarla — mostrarla en pantalla, escribirla en un archivo o enviarla por la red.
Si los métodos siempre imprimieran el resultado, nuestro programa estaría rígidamente atado a un único escenario y reutilizar la lógica sería difícil. El valor de retorno hace que los métodos sean flexibles y universales.
Analogía
Imagina una máquina de café. Metes dinero, pulsas un botón — y recibes café. Si la máquina solo dijera en voz alta «¡El café está listo!» (pero no te diera el café), no te alegraría. Con los métodos ocurre lo mismo: a veces no basta con oír «¡Listo!», sino que quieres obtener el resultado.
2. Tipo de valor de retorno: qué puede devolver un método
En Java, cuando declaras un método, indicas el tipo de valor de retorno — puede ser cualquier tipo: int, double, String, boolean, un array, incluso un objeto de tu propia clase. Si el método no devuelve nada — escribimos void.
Sintaxis:
type_of_returned_value methodName(parameters)
{
// cuerpo del método
}
Ejemplos:
int sum(int a, int b)
{
// devuelve int
}
String getGreeting(String name)
{
// devuelve String
}
boolean isEven(int number)
{
// devuelve boolean
}
void printHello()
{
// no devuelve nada — solo realiza una acción
}
¡Importante! El tipo de valor de retorno es la «promesa» del método: está obligado a devolver un valor de ese tipo. Si prometes devolver int pero devuelves String, el compilador se quejará y no permitirá compilar el programa.
3. Operador return: cómo devolver un valor desde un método
Para devolver realmente el resultado del trabajo del método «hacia fuera», se usa el operador return. Esta palabra dice: «Aquí tienes el resultado — y con esto mi trabajo ha terminado».
int sum(int a, int b)
{
int result = a + b;
return result; // devolvemos el resultado
}
Se puede hacer más corto:
int sum(int a, int b)
{
return a + b;
}
Cuando el método llega a la línea return, finaliza la ejecución, devuelve el valor indicado y lo entrega al lugar desde donde fue llamado.
Importante: el tipo del valor tras return debe coincidir con el tipo declarado del método.
4. Uso del valor de retorno: ¿qué hacer con él?
Cuando un método devuelve un valor, puedes:
- Guardarlo en una variable.
- Usarlo directamente en una expresión.
- Pasarlo a otro método.
int result = sum(5, 7); // lo guardamos en una variable
System.out.println(result); // mostramos el resultado
System.out.println(sum(10, 20)); // mostramos el resultado directamente
if (isEven(42))
{
System.out.println("¡El número es par!");
}
Ejemplo: método que devuelve una cadena
String getGreeting(String name)
{
return "Hola, " + name + "!";
}
// Uso:
String greeting = getGreeting("Alicia");
System.out.println(greeting); // ¡Hola, Alicia!
5. Práctica: ejemplos de métodos con valor de retorno
Método que devuelve el máximo de dos números
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
Se puede incluso más corto si ya dominas el operador ternario:
int max(int a, int b)
{
return (a > b) ? a : b;
}
Uso:
int maximum = max(10, 25);
System.out.println("Máximo: " + maximum); // Máximo: 25
Método que devuelve true si el número es par
boolean isEven(int number)
{
return number % 2 == 0;
}
Uso:
if (isEven(18))
{
System.out.println("¡El número es par!");
}
else
{
System.out.println("¡El número es impar!");
}
Método que devuelve la suma de los elementos de un array
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
Uso:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("Suma de las notas: " + total);
6. Qué ocurre al invocar un método con return
Cuando llamas a un método con valor de retorno, la ejecución del programa «entra» en el método, ejecuta su código, llega a return, devuelve el valor y lo coloca en el lugar de la llamada.
De forma esquemática:
int a = 2;
int b = 3;
int c = sum(a, b); // aquí se llama a sum(2, 3), se devuelve 5 y c pasa a valer 5
Diagrama de flujo
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[cálculos]
C --> D[return result]
D -->|el resultado se devuelve| A
7. Matices útiles
return finaliza la ejecución del método
En cuanto aparece return en un método, su ejecución se interrumpe inmediatamente. Todo lo que esté después — no se ejecuta.
int test()
{
return 42;
System.out.println("Esto no se imprimirá"); // unreachable
}
return en un método de tipo void
En un método void (que no devuelve nada) se puede usar return sin valor — simplemente para terminar antes la ejecución del método, por ejemplo, bajo cierta condición.
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("¡El número no es positivo!");
return; // salimos del método sin más
}
System.out.println("Número: " + number);
}
8. Errores típicos al trabajar con return
Error n.º 1: no todos los caminos devuelven un valor
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// ¿Y si number <= 0? ¡No hay return!
}
// Error: no todos los caminos del código devuelven un valor
Cómo corregirlo: asegúrate de tener return en todos los caminos de ejecución.
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
Error n.º 2: discordancia del tipo de retorno
int getNumber()
{
return "42"; // ¡Error! Se esperaba int, no String
}
Error n.º 3: return después de return
int test()
{
return 5;
System.out.println("Esto no se ejecutará"); // unreachable statement
}
Error n.º 4: return con expresión en un método void
void printSomething()
{
return 42; // ¡Error! Un método void no puede devolver un valor
}
Error n.º 5: ignorar el valor de retorno
sum(10, 20); // ¿y ya está? ¡Se perdió el resultado!
Si no utilizas el valor de retorno, simplemente se pierde. ¡No olvides guardarlo o pasarlo más adelante en el código!
Error n.º 6: esperar que return imprima algo
int result = sum(2, 3);
// return no imprime nada
// Hay que mostrarlo explícitamente:
System.out.println(result);
GO TO FULL VERSION