💭 What is it?

Learners believe that a return statement must always appear outside of loops, typically at the end of the function. They assume that placing a return inside a loop is either not allowed or poor style, and that the loop must complete before a result can be returned.

As a result, instead of returning immediately when a condition is met, they introduce temporary variables and use control statements like break to exit the loop, only returning the result after the loop has fully run.

For example:

float firstNegative(float[] a) {
  float first = 0;
  for (int i = 0; i < a.length; i++) {
    if (a[i] < 0) {
      first = a[i];
      break; // used instead of directly returning
    }
  }
  return first;
}

In this code, the learner avoids using return inside the loop, even though it would be more efficient and direct.


🛠️ Why is it incorrect?

A return statement can be used both inside or outside a loop. In fact, returning early from within a loop when a certain condition is met is often the most efficient and readable way to implement a function.

However, it is important that all possible execution paths of the function result in a return. If the compiler cannot guarantee this (for example if a return only appears inside a loop or conditional block without a fallback) it will throw an error. This does not mean that return statements are not allowed inside loops. Instead, it highlights the need for a fallback return to handle cases where the loop or condition is never executed, ensuring that the function always returns a value.

Inefficient code:

float firstNegative(float[] array) {
  float a = 0; // variable to store the first negative value
  for (int i = 0; i < array.length; i++) {
    // check if value is negative and no other has been found
    if (array[i] < 0 && a == 0) {
      a = array[i];
    }
  }
  return a; // return the stored value after the loop completed
}

Improved code:

float firstNegative(float[] array) {
  for (int i = 0; i < array.length; i++) {
    if (array[i] < 0) {
      return array[i]; // return immediately when a negative value is found
    }
  }
  return 0; // fallback return if no negative value was found
}

🧩 Typical errors
  1. Using a break instead of a direct return.
float firstNegative(float[] a) {
  float first = 0;
  for (int i = 0; i < a.length; i++) {
    if (a[i] < 0) {
      first = a[i];
      break; // used instead of directly returning
    }
  }
  return first;
}
  1. Creating temporary variables to store the result and returning them after the loop.
float firstNegative(float[] array) {
  float a = 0; // variable to store the first negative value
  for (int i = 0; i < array.length; i++) {
    // check if value is negative and no other has been found
    if (array[i] < 0 && a == 0) {
      a = array[i];
    }
  }
  return a; // return the stored value after the loop completed
}

🌱 Origin

Many educational examples place the return statement outside of loops, such as when calculating sums, leading students to overgeneralize this pattern.

Compilers produce errors when a return is exclusively inside a loop without a fallback outside, which students may misinterpret as indicating that return is not allowed within loops, rather than understanding that all code paths must return a value.


🧩 Related Exercises
7.3f) Prime Number
Winter 2024/25

Exercise 7.3f Screenshot

7.4c) First/last negative number
Winter 2024/25

Exercise 7.4c Screenshot


🧑‍🏫 Teaching Opportunities

Helpful Exercises:

Write a function that returns the first even number in an array. If no even number is found, the function should return -1.


Create two versions of a function that checks if a value exists in an array.

Version 1: The function should terminate early using return as soon as the value is found.

Version 2: The function should use a variable and return the result only at the end of the function. Which version is more efficient and why? Which version do you prefer, and why?


Peer Instruction Quizzes:

🧩 Peer Instruction Quiz

Why does this code produce an error?

boolean contains(int[] array, int value) {
    for (int i = 0; i < array.length; i++) {
        if (array[i] == value) {
            return true;
        }
    }
}
  1. The return is inside a loop, which is not allowed.
  2. A return outside of the loop is missing.
  3. The loop should also contain a return false.
  4. The returning data type is incorrect.

🧩 Peer Instruction Quiz

How can this code be made more efficient?

boolean firstNegative(int[] numbers) {
    int found = 0;
    for (int i = 0; i < numbers.length; i++) {
        if (found == 0 && numbers[i] <= 0) {
            found = numbers[i];
        }
    }
    return found;
}
  1. Add a break statement after found = numbers[i];
  2. Use return statement instead of the variable found.
  3. Remove the if statement and return true in the loop.
  4. The function is already optimal and does not need changes.