你是否试过用一个异常来结束一个正常的控制流,如

    1. try{
    2. int i = 0;
    3. while(true){
    4. range[i++].climb();
    5. }
    6. } catch (ArrayIndexOutOfBoundsException){
    7. }

    这样的写法确实很标新立异,而且确实能够实现遍历数组的目的,可能让你颇有成就感,就像探索到了新大陆一样。不过现实会泼你冷水,往往显得你对编程流于表面,没有思考,没有程序设计的概念,不注重代码质量。

    那么这样的写法有什么错误之处:

    • 掩盖了不可预知的错误,降低了维护性。因为代码认为抛出ArrayIndexOutOfBoundsException异常是一个正常的结束循环的信号,但是现实可能是代码确实存在了bug。
    • 降低了性能。因为JVM往往会对标准的遍历(如 for each),进行优化。当你把代码写在try-catch里,反而阻止了JVM的优化。
    • 另外,这样的代码很冗长,难道不是吗?

    所以,在使用异常的时候,应该坚持异常只应该被当做异常来处理。