Nested loops are fine as long as they describe the correct algorithm.

Nested loops have performance considerations (see @Travis-Pesetto's answer), but sometimes it's exactly the correct algorithm, e.g. when you need to access every value in a matrix.

Labeling loops in Java allows to prematurely break out of several nested loops when other ways to do this would be cumbersome. E.g. some game might have a piece of code like this:

 Player chosen_one = null;
 ...
 outer: // this is a label
 for (Player player : party.getPlayers()) {
 for (Cell cell : player.getVisibleMapCells()) {
 for (Item artefact : cell.getItemsOnTheFloor())
 if (artefact == HOLY_GRAIL) {
 chosen_one = player;
 break outer; // everyone stop looking, we found it
 }
 }
 }

While code like the example above may sometimes be the optimal way to express a certain algorithm, it is usually better to break this code into smaller functions, and probably use `return` instead of `break`. So a `break` with a label is a faint [code smell](http://en.wikipedia.org/wiki/Code_smell); pay extra attention when you see it.