I fixed a bug yesterday caused by a loop that terminated too early. It took me a while to understand the fact that it was terminating too early, and I realised that I’ve never written this type of bug because of the way that I tend to write code. Basically, the method looked like this:
public void someMethod() { for ( String key : keys ) { if (someCondition()) { return; } doSomeProcessingForThe(key); } }
As you can see, the innocent looking return
statement breaks out of the entire method, and what they really wanted was a continue
statement instead. Note that TDD had been applied to this codebase, and it’s just another reminder that driving your code with tests isn’t enough (you also want to think of ensuring you write more comprehensive tests, particularly for loops).
I’m writing this post because I though it’s interesting that I realised a certain coding style removes (and possibly adds) a whole class of bugs. Had I been writing the code to start with, I probably would have avoided the use of the return (and/or continue) statement resulting in the following code:
public void someMethod() { for ( String key : keys ) { if (!someCondition()) { doSomeProcessingForThe(key); } } }
Prevention is easy with tools like checkstyle, PMD or findbugs (and maybe some of them already check for this). If not, I think it’d be easy to add.