Loop counters should not be modified in the body of the loop. However other loop control variables representing logical values may be modified in the loop, for example a flag to indicate that something has been completed, which is then tested in the for statement.

The following code:

String[] names = new String[]{ "Jack", "Jim", null, "John" };
for (int i = 0; i < names.length; i++) {
  if (names[i] == null) {
    i = names.length;                                             // Non-Compliant
  } else {
    System.out.println(names[i]);
  }
}

should be refactored into:

String[] names = new String[]{ "Jack", "Jim", null, "John" };
for (String name: names) {
  if (name == null) {
    break;                                                        // Compliant
  }
  System.out.println(name);
}