Everything You Need to Know About Loops in Java

Alexander Obregon
20 min readJun 9, 2024

--

Image Source

Introduction

In programming, loops are fundamental constructs that allow us to execute a block of code repeatedly based on a condition. Java, being a flexible and widely-used programming language, provides several types of loops to help developers control the flow of their programs effectively. In this article, we will explore the different types of loops in Java, how to use and create them, and which kinds of loops to use in various scenarios. This guide is made for beginners and will include plenty of code examples.

What Are Loops?

Loops are fundamental control flow structures in programming that enable the execution of a block of code repeatedly based on a specified condition. They are essential for automating repetitive tasks, reducing the need for redundant code, and improving the efficiency and readability of programs. Understanding loops is important for any programmer, as they are a core concept in virtually all programming languages, including Java.

Why Loops Are Important

Loops are used extensively in programming for various reasons:

  1. Automation of Repetitive Tasks: Many tasks in programming involve repetition, such as processing elements of an array, reading lines from a file, or performing calculations over a range of values. Loops allow these tasks to be automated efficiently without manually writing out each step.
  2. Code Simplification and Readability: Using loops can significantly simplify code by reducing the need for repetitive statements. This not only makes the code more concise but also enhances its readability and maintainability. For instance, instead of writing multiple statements to print numbers from 1 to 10, a loop can achieve the same result with just a few lines of code.
  3. Dynamic Control Flow: Loops provide dynamic control over the execution flow of a program. They enable the execution of code blocks a specific number of times or until a certain condition is met. This flexibility is crucial for tasks where the number of iterations cannot be determined in advance, such as reading user input until a valid response is received.
  4. Efficiency in Data Processing: Loops are particularly useful in scenarios involving data processing and manipulation. They allow for efficient traversal and modification of data structures like arrays, lists, and other collections. This is especially important in applications that handle large volumes of data, where manual processing would be impractical.

Types of Loops in Java

Java provides several types of loops to cater to different programming needs:

  • for Loop: Ideal for situations where the number of iterations is known beforehand. It combines initialization, condition-checking, and iteration in a single line, making it concise and easy to use.
  • while Loop: Suitable for scenarios where the number of iterations is not known in advance. It continues to execute the code block as long as the specified condition remains true.
  • do-while Loop: Similar to the while loop but ensures that the code block is executed at least once before the condition is checked.
  • Enhanced for Loop (for-each Loop): Specifically designed for iterating over arrays and collections, providing a simplified and more readable syntax compared to the traditional for loop.

Common Use Cases

Loops are versatile and can be applied in various contexts, such as:

  • Iterating over Data Structures: Accessing and manipulating elements in arrays, lists, sets, and other collections.
  • Performing Calculations: Repeating mathematical operations, such as summing a series of numbers or generating sequences.
  • User Input Handling: Continuously prompting users for input until a valid response is received.
  • File Processing: Reading lines from a file until the end of the file is reached.

The for Loop

The for loop is one of the most commonly used loops in Java due to its simplicity and flexibility. It is ideal for situations where the number of iterations is known beforehand. The for loop allows you to iterate over a block of code a specific number of times, making it a powerful tool for tasks that require repetitive actions.

Syntax of the for Loop

The basic syntax of the for loop in Java is as follows:

for (initialization; condition; increment/decrement) {
// Code to be executed
}
  • initialization: This is executed once at the beginning of the loop. It is typically used to initialize a loop control variable.
  • condition: This is evaluated before each iteration. If the condition is true, the loop body is executed; if it is false, the loop terminates.
  • increment/decrement: This is executed after each iteration of the loop. It is typically used to update the loop control variable.

Simple Example

Let’s look at a simple example to understand how the for loop works:

public class ForLoopExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("Iteration: " + i);
}
}
}

In this example:

  • The loop control variable i is initialized to 0.
  • The condition i < 5 is checked before each iteration.
  • After each iteration, i is incremented by 1.
  • The loop runs five times, printing the current value of i each time.

Example Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
  • The loop starts with i = 0 and prints "Iteration: 0".
  • It then increments i to 1 and prints "Iteration: 1".
  • This process repeats until i reaches 4, and the loop stops after printing "Iteration: 4" because the condition i < 5 is no longer true.

Nested for Loops

A for loop can be nested within another for loop to handle more complex scenarios, such as iterating over multi-dimensional arrays.

Example of Nested for Loops:

public class NestedForLoopExample {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println("i: " + i + ", j: " + j);
}
}
}
}

In this example, the outer loop runs three times, and for each iteration of the outer loop, the inner loop also runs three times. This results in a total of 9 iterations, printing all combinations of i and j.

Example Output:

i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
i: 2, j: 2
i: 2, j: 3
i: 3, j: 1
i: 3, j: 2
i: 3, j: 3
  • The outer loop variable i takes values 1, 2, and 3.
  • For each value of i, the inner loop variable j takes values 1, 2, and 3.
  • The program prints all combinations of i and j.

Using the for Loop with Arrays

The for loop is particularly useful for iterating over arrays.

Example with Arrays:

public class ArrayForLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
for (int i = 0; i < numbers.length; i++) {
System.out.println("Element at index " + i + ": " + numbers[i]);
}
}
}

In this example:

  • The loop runs from i = 0 to i < numbers.length, iterating over each element in the numbers array.
  • The current element of the array is accessed using numbers[i].

Example Output:

Element at index 0: 10
Element at index 1: 20
Element at index 2: 30
Element at index 3: 40
Element at index 4: 50
  • The loop iterates through each index of the numbers array.
  • For each index, it prints the element at that index.

Controlling the Loop Execution

The for loop can be controlled using the break and continue statements.

  • break Statement: Terminates the loop prematurely.
  • continue Statement: Skips the current iteration and proceeds to the next iteration.

Example Using break and continue:

public class ControlForLoopExample {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // Terminates the loop when i is 5
}
if (i % 2 == 0) {
continue; // Skips the current iteration if i is even
}
System.out.println("Iteration: " + i);
}
}
}

In this example:

  • The break statement terminates the loop when i is 5.
  • The continue statement skips the current iteration when i is even.

Example Output:

Iteration: 1
Iteration: 3
Iteration: 5
  • The loop skips even values of i due to the continue statement.
  • The loop terminates when i reaches 5 due to the break statement.

The while Loop

The while loop is used when the number of iterations is not known beforehand and depends on a condition. It continues to execute the block of code as long as the specified condition is true, making it useful for scenarios where you need to repeat actions until a particular condition is met.

Syntax of the while Loop

The basic syntax of the while loop in Java is as follows:

while (condition) {
// Code to be executed
}
  • condition: This is evaluated before each iteration. If the condition is true, the loop body is executed; if it is false, the loop terminates.

Simple Example

Let’s look at a simple example to understand how the while loop works:

public class WhileLoopExample {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
System.out.println("Iteration: " + i);
i++;
}
}
}

In this example:

  • The loop control variable i is initialized to 0.
  • The condition i < 5 is checked before each iteration.
  • After each iteration, i is incremented by 1.
  • The loop runs five times, printing the current value of i each time.

Example Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
  • The loop starts with i = 0 and prints "Iteration: 0".
  • It then increments i to 1 and prints "Iteration: 1".
  • This process repeats until i reaches 4, and the loop stops after printing "Iteration: 4" because the condition i < 5 is no longer true.

Nested while Loops

A while loop can be nested within another while loop to handle more complex scenarios, such as iterating over multi-dimensional arrays.

Example of Nested while Loops:

public class NestedWhileLoopExample {
public static void main(String[] args) {
int i = 1;
while (i <= 3) {
int j = 1;
while (j <= 3) {
System.out.println("i: " + i + ", j: " + j);
j++;
}
i++;
}
}
}

In this example, the outer loop runs three times, and for each iteration of the outer loop, the inner loop also runs three times. This results in a total of 9 iterations, printing all combinations of i and j.

Example Output:

i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
i: 2, j: 2
i: 2, j: 3
i: 3, j: 1
i: 3, j: 2
i: 3, j: 3
  • The outer loop variable i takes values 1, 2, and 3.
  • For each value of i, the inner loop variable j takes values 1, 2, and 3.
  • The program prints all combinations of i and j.

Using the while Loop with Arrays

The while loop is particularly useful for iterating over arrays when the number of iterations is not predetermined.

Example with Arrays:

public class ArrayWhileLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
int i = 0;
while (i < numbers.length) {
System.out.println("Element at index " + i + ": " + numbers[i]);
i++;
}
}
}

In this example:

  • The loop runs from i = 0 to i < numbers.length, iterating over each element in the numbers array.
  • The current element of the array is accessed using numbers[i].

Example Output:

Element at index 0: 10
Element at index 1: 20
Element at index 2: 30
Element at index 3: 40
Element at index 4: 50
  • The loop iterates through each index of the numbers array.
  • For each index, it prints the element at that index.

Controlling the Loop Execution

The while loop can be controlled using the break and continue statements.

  • break Statement: Terminates the loop prematurely.
  • continue Statement: Skips the current iteration and proceeds to the next iteration.

Example Using break and continue:

public class ControlWhileLoopExample {
public static void main(String[] args) {
int i = 0;
while (i < 10) {
if (i == 5) {
break; // Terminates the loop when i is 5
}
if (i % 2 == 0) {
i++;
continue; // Skips the current iteration if i is even
}
System.out.println("Iteration: " + i);
i++;
}
}
}

In this example:

  • The break statement terminates the loop when i is 5.
  • The continue statement skips the current iteration when i is even.

Example Output:

Iteration: 1
Iteration: 3
Iteration: 5
  • The loop skips even values of i due to the continue statement.
  • The loop terminates when i reaches 5 due to the break statement.

The do-while Loop

The do-while loop is similar to the while loop, but it guarantees that the code block is executed at least once, even if the condition is false from the beginning. This makes the do-while loop useful in scenarios where you want to ensure that the loop body is executed at least one time.

Syntax of the do-while Loop

The basic syntax of the do-while loop in Java is as follows:

do {
// Code to be executed
} while (condition);
  • condition: This is evaluated after each iteration. If the condition is true, the loop body is executed again; if it is false, the loop terminates.

Simple Example

Let’s look at a simple example to understand how the do-while loop works:

public class DoWhileLoopExample {
public static void main(String[] args) {
int i = 0;
do {
System.out.println("Iteration: " + i);
i++;
} while (i < 5);
}
}

In this example:

  • The loop control variable i is initialized to 0.
  • The loop body is executed first, printing the current value of i.
  • After each iteration, i is incremented by 1.
  • The condition i < 5 is checked after each iteration, and the loop runs as long as this condition is true.

Example Output:

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
  • The loop starts with i = 0 and prints "Iteration: 0".
  • It then increments i to 1 and prints "Iteration: 1".
  • This process repeats until i reaches 4, and the loop stops after printing "Iteration: 4" because the condition i < 5 is no longer true.

Nested do-while Loops

A do-while loop can be nested within another do-while loop to handle more complex scenarios, such as iterating over multi-dimensional arrays.

Example of Nested do-while Loops:

public class NestedDoWhileLoopExample {
public static void main(String[] args) {
int i = 1;
do {
int j = 1;
do {
System.out.println("i: " + i + ", j: " + j);
j++;
} while (j <= 3);
i++;
} while (i <= 3);
}
}

In this example, the outer loop runs three times, and for each iteration of the outer loop, the inner loop also runs three times. This results in a total of 9 iterations, printing all combinations of i and j.

Example Output:

i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
i: 2, j: 2
i: 2, j: 3
i: 3, j: 1
i: 3, j: 2
i: 3, j: 3
  • The outer loop variable i takes values 1, 2, and 3.
  • For each value of i, the inner loop variable j takes values 1, 2, and 3.
  • The program prints all combinations of i and j.

Using the do-while Loop with Arrays

The do-while loop can also be used for iterating over arrays, especially when you want to ensure that the loop body executes at least once.

Example with Arrays:

public class ArrayDoWhileLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
int i = 0;
do {
System.out.println("Element at index " + i + ": " + numbers[i]);
i++;
} while (i < numbers.length);
}
}

In this example:

  • The loop runs from i = 0 to i < numbers.length, iterating over each element in the numbers array.
  • The current element of the array is accessed using numbers[i].

Example Output:

Element at index 0: 10
Element at index 1: 20
Element at index 2: 30
Element at index 3: 40
Element at index 4: 50
  • The loop iterates through each index of the numbers array.
  • For each index, it prints the element at that index.

Controlling the Loop Execution

The do-while loop can be controlled using the break and continue statements.

  • break Statement: Terminates the loop prematurely.
  • continue Statement: Skips the current iteration and proceeds to the next iteration.

Example Using break and continue:

public class ControlDoWhileLoopExample {
public static void main(String[] args) {
int i = 0;
do {
if (i == 5) {
break; // Terminates the loop when i is 5
}
if (i % 2 == 0) {
i++;
continue; // Skips the current iteration if i is even
}
System.out.println("Iteration: " + i);
i++;
} while (i < 10);
}
}

In this example:

  • The break statement terminates the loop when i is 5.
  • The continue statement skips the current iteration when i is even.

Example Output:

Iteration: 1
Iteration: 3
Iteration: 5
  • The loop skips even values of i due to the continue statement.
  • The loop terminates when i reaches 5 due to the break statement.

Enhanced for Loop (for-each Loop)

The enhanced for loop, also known as the for-each loop, is used to iterate over arrays or collections in a more readable and concise manner compared to the traditional for loop. It is specifically designed to traverse elements without the need for an explicit counter or index variable, making the code easier to write and understand.

Syntax of the Enhanced for Loop

The basic syntax of the enhanced for loop in Java is as follows:

for (dataType item : array) {
// Code to be executed
}
  • dataType: The type of the elements in the array or collection.
  • item: The variable that holds the current element during each iteration.
  • array: The array or collection to be iterated over.

Simple Example

Let’s look at a simple example to understand how the enhanced for loop works:

public class ForEachLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
for (int number : numbers) {
System.out.println("Number: " + number);
}
}
}

In this example:

  • The loop iterates over each element in the numbers array.
  • The current element is accessed using the number variable.

Example Output:

Number: 10
Number: 20
Number: 30
Number: 40
Number: 50
  • The loop iterates through each element in the numbers array.
  • For each element, it prints the value of the element.

Using the Enhanced for Loop with Collections

The enhanced for loop is particularly useful for iterating over collections, such as lists and sets, providing a clean and concise way to traverse elements.

Example with Collections:

import java.util.ArrayList;
import java.util.List;

public class CollectionForEachLoopExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Kaitlyn");
names.add("Alex");
names.add("Ben");

for (String name : names) {
System.out.println("Name: " + name);
}
}
}

In this example:

  • The loop iterates over each element in the names list.
  • The current element is accessed using the name variable.

Example Output:

Name: Kaitlyn
Name: Alex
Name: Ben
  • The loop iterates through each element in the names list.
  • For each element, it prints the value of the element.

Nested Enhanced for Loops

An enhanced for loop can be nested within another enhanced for loop to handle more complex scenarios, such as iterating over multi-dimensional arrays or nested collections.

Example of Nested Enhanced for Loops:

public class NestedForEachLoopExample {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

for (int[] row : matrix) {
for (int element : row) {
System.out.print(element + " ");
}
System.out.println();
}
}
}

In this example, the outer loop iterates over each row in the matrix, and the inner loop iterates over each element in the current row.

Example Output:

1 2 3
4 5 6
7 8 9
  • The outer loop iterates through each row of the matrix.
  • The inner loop iterates through each element in the current row, printing the elements in a matrix format.

Using the Enhanced for Loop with Strings

The enhanced for loop can also be used to iterate over characters in a string by converting the string to a character array.

Example with Strings:

public class StringForEachLoopExample {
public static void main(String[] args) {
String text = "Hello";
for (char letter : text.toCharArray()) {
System.out.println("Letter: " + letter);
}
}
}

In this example:

  • The loop iterates over each character in the text string.
  • The current character is accessed using the letter variable.

Example Output:

Letter: H
Letter: e
Letter: l
Letter: l
Letter: o
  • The loop iterates through each character in the text string.
  • For each character, it prints the value of the character.

Controlling the Enhanced for Loop Execution

The enhanced for loop can also be controlled using the break and continue statements.

  • break Statement: Terminates the loop prematurely.
  • continue Statement: Skips the current iteration and proceeds to the next iteration.

Example Using break and continue:

public class ControlForEachLoopExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

for (int number : numbers) {
if (number == 5) {
break; // Terminates the loop when number is 5
}
if (number % 2 == 0) {
continue; // Skips the current iteration if number is even
}
System.out.println("Number: " + number);
}
}
}

In this example:

  • The break statement terminates the loop when number is 5.
  • The continue statement skips the current iteration when number is even.

Example Output:

Number: 1
Number: 3
  • The loop skips even values of number due to the continue statement.
  • The loop terminates when number reaches 5 due to the break statement.

When to Use Which Loop?

In Java, the for, while, and do-while loops can often be used to achieve the same goal, as demonstrated by the consistent outputs in the previous sections. However, each loop has its strengths and weaknesses, making them more suitable for specific scenarios. Understanding when to use each loop can help you write more efficient and readable code.

for Loop

The for loop is best suited for situations where the number of iterations is known beforehand. It combines initialization, condition-checking, and iteration in a single line, making it concise and easy to use.

Strengths:

  • Ideal for fixed iteration counts.
  • Initialization, condition, and increment are all in one place, improving readability.

Weaknesses:

  • Less flexible for scenarios where the number of iterations is not known in advance.

Example:

public class ForLoopStrengthExample {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("Square of " + i + " is: " + (i * i));
}
}
}

Example Output:

Square of 1 is: 1
Square of 2 is: 4
Square of 3 is: 9
Square of 4 is: 16
Square of 5 is: 25
Square of 6 is: 36
Square of 7 is: 49
Square of 8 is: 64
Square of 9 is: 81
Square of 10 is: 100

This example demonstrates the strength of the for loop in iterating a known number of times (10 iterations) and calculating the square of each number.

while Loop

The while loop is more flexible and is used when the number of iterations is not known beforehand. It continues to execute the block of code as long as the specified condition remains true.

Strengths:

  • Ideal for scenarios where the number of iterations is unknown.
  • More flexible for conditional loops.

Weaknesses:

  • The initialization, condition, and increment are not in one place, which can affect readability.

Example:

import java.util.Scanner;

public class WhileLoopStrengthExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input;
while (true) {
System.out.println("Enter 'exit' to terminate the loop:");
input = scanner.nextLine();
if ("exit".equalsIgnoreCase(input)) {
break;
}
System.out.println("You entered: " + input);
}
scanner.close();
}
}

Example Output:

Enter 'exit' to terminate the loop:
hello
You entered: hello
Enter 'exit' to terminate the loop:
world
You entered: world
Enter 'exit' to terminate the loop:
exit

This example shows the strength of the while loop in handling an unknown number of iterations based on user input.

do-while Loop

The do-while loop is similar to the while loop but guarantees that the code block is executed at least once, even if the condition is false from the beginning.

Strengths:

  • Makes sure the loop body is executed at least once.
  • Useful for scenarios where the initial action must occur before the condition is checked.

Weaknesses:

  • Less commonly used, which might affect code readability for some developers.

Example:

import java.util.Scanner;

public class DoWhileLoopStrengthExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number;
do {
System.out.print("Enter a positive number: ");
number = scanner.nextInt();
if (number <= 0) {
System.out.println("That's not a positive number.");
}
} while (number <= 0);
System.out.println("You entered: " + number);
scanner.close();
}
}

Example Output:

Enter a positive number: -5
That's not a positive number.
Enter a positive number: 0
That's not a positive number.
Enter a positive number: 10
You entered: 10

This example demonstrates the strength of the do-while loop in making sure that the user is prompted at least once to enter a positive number.

Enhanced for Loop (for-each Loop)

The enhanced for loop, also known as the for-each loop, is designed to simplify the iteration over arrays and collections. It provides a cleaner and more readable syntax by eliminating the need for an explicit counter or index variable.

Strengths:

  • Ideal for iterating over arrays and collections.
  • Simplifies the code by removing the need for an index variable.
  • Enhances readability and reduces the risk of errors associated with index manipulation.

Weaknesses:

  • Limited to forward-only iteration.
  • Not suitable for scenarios where you need to modify the collection during iteration or access the index.

Example:

import java.util.ArrayList;
import java.util.List;

public class EnhancedForLoopStrengthExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Orange");
fruits.add("Lemon");
fruits.add("Mango");

for (String fruit : fruits) {
System.out.println("Fruit: " + fruit);
}
}
}

Example Output:

Fruit: Orange
Fruit: Lemon
Fruit: Mango

This example demonstrates the strength of the enhanced for loop in iterating over a collection of fruits and printing each fruit without needing an explicit index.

Summary

  • Use a for loop when you know the exact number of iterations. It's concise and keeps all loop-related statements in one place.
  • Use a while loop when the number of iterations is unknown and depends on a condition that could be true for an unpredictable number of iterations.
  • Use a do-while loop when you need the loop body to execute at least once before the condition is tested, ensuring that the action occurs at least once regardless of the condition.
  • Use an enhanced for loop when you need a simple and readable way to iterate over arrays or collections without requiring an index variable.

Things to Watch Out For

While loops are powerful tools in Java programming, they can also lead to common mistakes and issues if not used correctly. Understanding these potential problems can help you avoid them and write more efficient, error-free code.

Infinite Loops

Infinite loops occur when the loop’s termination condition is never met, causing the loop to run indefinitely. This can lead to your program becoming unresponsive or crashing.

Example of an Infinite Loop:

public class InfiniteLoopExample {
public static void main(String[] args) {
int i = 0;
while (i >= 0) {
System.out.println("Iteration: " + i);
i++;
}
}
}

The condition i >= 0 will always be true since i is always incremented, leading to an infinite loop.

How to Avoid:

  • Make sure that the loop condition will eventually become false.
  • Use debugging techniques or print statements to monitor loop variables and conditions.

Off-by-One Errors

Off-by-one errors occur when the loop runs one iteration too many or too few. This often happens due to incorrect initialization or condition checks.

Example of an Off-by-One Error:

public class OffByOneErrorExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
for (int i = 0; i <= numbers.length; i++) { // Off-by-one error
System.out.println("Element at index " + i + ": " + numbers[i]);
}
}
}

The condition i <= numbers.length will cause an ArrayIndexOutOfBoundsException when i equals numbers.length.

How to Avoid:

  • Use the correct condition, such as i < numbers.length, to make sure the loop iterates within the array bounds.

Modifying the Collection During Iteration

Modifying a collection while iterating over it can lead to ConcurrentModificationException.

Example of Modifying a Collection During Iteration:

import java.util.ArrayList;
import java.util.List;

public class ModifyCollectionExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Orange");
fruits.add("Lemon");
fruits.add("Mango");

for (String fruit : fruits) {
if (fruit.equals("Lemon")) {
fruits.remove(fruit); // Modifying collection during iteration
}
}
}
}

Removing an element while iterating over the list will cause a ConcurrentModificationException.

How to Avoid:

  • Use an iterator to safely remove elements during iteration.

Example using an iterator:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class SafeModifyCollectionExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Orange");
fruits.add("Lemon");
fruits.add("Mango");

Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
if (fruit.equals("Lemon")) {
iterator.remove(); // Safe removal using iterator
}
}
}
}

Incorrect Loop Initialization or Update

Incorrectly initializing or updating the loop control variable can lead to unexpected behavior or infinite loops.

Example of Incorrect Initialization:

public class IncorrectInitializationExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i--) { // Incorrect update causing infinite loop
System.out.println("Iteration: " + i);
}
}
}

The loop control variable i is decremented instead of incremented, causing an infinite loop.

How to Avoid:

  • Double-check the initialization and update expressions to ensure they correctly modify the loop control variable.

Conclusion

Loops are fundamental constructs in Java that enable efficient and readable code by automating repetitive tasks. Understanding the different types of loops — for, while, do-while, and enhanced for loops—along with their strengths and appropriate use cases, is important for any programmer. By being aware of common problems, such as infinite loops and off-by-one errors, and practicing proper loop control, you can write strong and effective Java code. Keep experimenting with loops in various scenarios to strengthen your programming skills and build a solid foundation for more advanced concepts.

  1. Official Java Documentation
  2. Java For Loop — W3Schools tutorial on for loops.
  3. Java While Loop — W3Schools tutorial on while loops.
  4. Java Do-While Loop — W3Schools tutorial on do-while loops.

Thank you for reading! If you find this article helpful, please consider highlighting, clapping, responding or connecting with me on Twitter/X as it’s very appreciated!

--

--

Alexander Obregon

Software Engineer, fervent coder & writer. Devoted to learning & assisting others. Connect on LinkedIn: https://www.linkedin.com/in/alexander-obregon-97849b229/