We have a Java Application that has a few modules that know to read text files. They do it quite simply with a code like this:
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null)
{
... // do stuff to file here
}
I ran PMD on my project and got the ‘AssignmentInOperand‘ violation on the while (...) line.
Is there a simpler way of doing this loop other than the obvious:
String line = br.readLine();
while (line != null)
{
... // do stuff to file here
line = br.readLine();
}
Is this considered a better practice? (although we “duplicate” the line = br.readLine() code?)
I generally prefer the former. I don’t generally like side-effects within a comparison, but this particular example is an idiom which is so common and so handy that I don’t object to it.
(In C# there’s a nicer option: a method to return an
IEnumerable<string>which you can iterate over with foreach; that isn’t as nice in Java because there’s no auto-dispose at the end of an enhanced for loop… and also because you can’t throwIOExceptionfrom the iterator, which means you can’t just make one a drop-in replacement for the other.)To put it another way: the duplicate line issue bothers me more than the assignment-within-operand issue. I’m used to taking in this pattern at a glance – with the duplicate line version I need to stop and check that everything’s in the right place. That’s probably habit as much as anything else, but I don’t think it’s a problem.