From Effective Java 2/e by Joshua Bloch
- Exceptions are, as their name implies, to be used only for exceptional conditions; they should never be used for ordi- nary control flow
- A well-designed API must not force its clients to use exceptions for ordinary control flow
Example #1
// Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch(ArrayIndexOutOfBoundsException e) { } for (Mountain m : range) m.climb();
- Because exceptions are designed for exceptional circumstances, there is little incentive for JVM implementors to make them as fast as explicit tests.
- Placingcodeinsideatry-catchblockinhibitscertainoptimizationsthatmod- ern JVM implementations might otherwise perform.
- The standard idiom for looping through an array doesn’t necessarily result in redundant checks. Modern JVM implementations optimize them away.
Example #2
// Do not use this hideous code for iteration over a collection! try { Iterator<Foo> i = collection.iterator(); while(true) { Foo foo = i.next(); ... } } catch (NoSuchElementException e) { } for (Iterator<Foo> i = collection.iterator(); i.hasNext(); ) { Foo foo = i.next(); ... }