![]() |
|
|
|||||||
![]() |
Java - How would I rewrite this to satisfy the code checker? |
|
|
Thread Tools | Search this Thread |
|
|
#1 |
|
Hi,
I'm using Java 1.5, Eclipse Galileo on Mac 10.5.6 and the code checking plug-in (PMD) is complaining about the below block ... BufferedReader reader = new BufferedReader(new InputStreamReader (fileStream)); StringBuilder stringBuf = new StringBuilder(); String line = null; ... while ((line = reader.readLine()) != null) { stringBuf.append(line + "\n"); } saying, "Avoid assignments in operands". How would I rewrite the while loop to make this error go away but achieve the same functionality? Thanks, - Dave laredotornado |
|
|
|
|
#2 |
|
Posts: n/a
|
laredotornado wrote:
> I'm using Java 1.5, Eclipse Galileo on Mac 10.5.6 and the code > checking plug-in (PMD) is complaining about the below block ... > > * * * * * * * * * * * * * BufferedReader reader = new BufferedReader(new InputStreamReader > (fileStream)); Hey, lighten up on the indentation! Use a maximum of four spaces per indent level and don't use TAB characters for Usenet code posts. > * * * * * * * * * * * * * StringBuilder stringBuf = new StringBuilder(); Your variable name choice is slightly misleading. > * * * * * * * * * * * * * String line = null; > * * * * * * * * * * * * * ... > * * * * * * * * * * * * * * * * * while ((line = reader.readLine()) != null) { > * * * * * * * * * * * * * * * * * * * * * stringBuf.append(line + "\n"); > * * * * * * * * * * * * * * * * * } > > saying, "Avoid assignments in operands". *How would I rewrite the > while loop to make this error go away but achieve the same > functionality? > It's not an error, it's a warning and not even a standard warning for Java. It's a perfectly legal construct. However, it does elevate the scope of the variable 'line' beyond where it should be. Also, the assignment of 'null' to it is superfluous. So really your "checker" is giving you good advice. You could use a 'for' loop. for ( String line = reader.readLine(); line != null; line = reader.readLine() ) { ... } Does FindBugs work on the Mac? -- Lew Lew |
|
|
|
#3 |
|
Posts: n/a
|
On Nov 4, 2:21*pm, Lew <l...@lewscanon.com> wrote:
> laredotornado wrote: > > I'm using Java 1.5, Eclipse Galileo on Mac 10.5.6 and the code > > checking plug-in (PMD) is complaining about the below block ... > > > * * * * * * * * * * * * * BufferedReader reader = new BufferedReader(new InputStreamReader > > (fileStream)); > > Hey, lighten up on the indentation! > > Use a maximum of four spaces per indent level and don't use TAB > characters for Usenet code posts. > > > * * * * * * * * * * * * * StringBuilder stringBuf = new StringBuilder(); > > Your variable name choice is slightly misleading. > > > * * * * * * * * * * * * * String line = null; > > * * * * * * * * * * * * * ... > > * * * * * * * * * * * * * * * * * while ((line = reader.readLine()) != null) { > > * * * * * * * * * * * * * * * * * * * * * stringBuf.append(line + "\n"); > > * * * * * * * * * * * * * * * * * } > > > saying, "Avoid assignments in operands". *How would I rewrite the > > while loop to make this error go away but achieve the same > > functionality? > > It's not an error, it's a warning and not even a standard warning for > Java. *It's a perfectly legal construct. *However, it does elevate the > scope of the variable 'line' beyond where it should be. *Also, the > assignment of 'null' to it is superfluous. *So really your "checker" > is giving you good advice. > > You could use a 'for' loop. > > *for ( String line = reader.readLine(); line != null; line = > reader.readLine() ) > *{ > * *... > *} > > Does FindBugs work on the Mac? > > -- > Lew Sweet! Works like a dream. 5 stars. I don't know if FindBugs works on a Mac but there is a plug-in for Eclipse and since Eclipse is cross-platform, I assume so, but haven't tried FindBugs yet. Thanks, - laredotornado |
|
|
|
#4 |
|
Posts: n/a
|
laredotornado wrote:
> On Nov 4, 2:21 pm, Lew <l...@lewscanon.com> wrote: [ SNIP ] >> >> Does FindBugs work on the Mac? >> >> -- >> Lew > > Sweet! Works like a dream. 5 stars. > > I don't know if FindBugs works on a Mac but there is a plug-in for > Eclipse and since Eclipse is cross-platform, I assume so, but haven't > tried FindBugs yet. > > Thanks, - FindBugs Eclipse plugin and FindBugs standalone work just fine on Mac OS X 10.5/10.6. AHS Arved Sandstrom |
|
|
|
#5 |
|
Posts: n/a
|
On Wed, 4 Nov 2009 13:06:20 -0800 (PST), laredotornado
<> wrote, quoted or indirectly quoted someone who said : >hile ((line = reader.readLine()) != null) { > stringBuf.append(line + "\n"); > } > >saying, "Avoid assignments in operands". How would I rewrite the >while loop to make this error go away but achieve the same >functionality? That code is fine. There is really no other way to do it. However in general it is confusing to newbies if you write code of the form: x = ( a = b ); // = assignment embedded in expression. as opposed to x = ( a == b ); -- Roedy Green Canadian Mind Products http://mindprod.com An example (complete and annotated) is worth 1000 lines of BNF. Roedy Green |
|
|
|
#6 |
|
Posts: n/a
|
On Nov 5, 12:59 am, Roedy Green <see_webs...@mindprod.com.invalid>
wrote: > On Wed, 4 Nov 2009 13:06:20 -0800 (PST), laredotornado > <laredotorn...@zipmail.com> wrote, quoted or indirectly quoted someone > who said : > > >while ((line = reader.readLine()) != null) { > > stringBuf.append(line + "\n"); > >} > [code edited for appearance] > >saying, "Avoid assignments in operands". How would I rewrite the > >while loop to make this error go away but achieve the same > >functionality? > > That code is fine. There is really no other way to do it. However in > general it is confusing to newbies if you write code of the form: > > x = ( a = b ); // = assignment embedded in expression. > as opposed to > x = ( a == b ); > -- > Roedy Green Canadian Mind Productshttp://mindprod.com > > An example (complete and annotated) is worth 1000 lines of BNF. The problem with this idiom for me is that you have a choice of either having a statement that has side effects, e.g., the original code, or you need to duplicate the read statement. While both of these are legal I don't like either. They both seem inelegant. Using the for statement as Lew suggested at least makes sure that the two reads are close together. This idiom is pretty common and I wonder if it's worth considering a little bit of syntax that would allow (imho) cleaner code. Perhaps something equivalent to the for loop where the action that takes place at the bottom of the loop in a standard for loop takes place at the top of the loop. I.e., for (a; b; c) {d} is equivalent to { a; while (b) { d; c; } } If we extended the while loop where while(a; b; c) {d} is rendered as { a; while (1) { b; if (c) { d; } else { break; } } } Then the original request becomes while(; line=reader.readLine(); line != null) { ... } which avoids both the statement with side effects and duplication of the readLine(). Of with all three clauses while (Reader r = getReader(); line=r.readLine(); line != null) { I think I would use such this rather often were it available. Has such a construct been implemented in other languages or proposed for Java? Regards, Tom McGlynn Tom McGlynn |
|
|
|
#7 |
|
Posts: n/a
|
Roedy Green wrote:
> On Wed, 4 Nov 2009 13:06:20 -0800 (PST), laredotornado > <> wrote, quoted or indirectly quoted someone > who said : > >> hile ((line = reader.readLine()) != null) { >> stringBuf.append(line + "\n"); >> } >> >> saying, "Avoid assignments in operands". How would I rewrite the >> while loop to make this error go away but achieve the same >> functionality? > > That code is fine. There is really no other way to do it. However in > general it is confusing to newbies if you write code of the form: The code isn't necessarily fine. It puts the scope of 'line' outside the loop, where in most cases it should be confined to the loop. There is really another way to do it, posted about eight hours prior to your post and quoted by the OP. This other way confines the scope of 'line' to the loop. -- Lew Lew |
|
|
|
#8 |
|
Posts: n/a
|
Tom McGlynn wrote:
> The problem with this idiom for me is that you have a choice of either > having a statement that has side effects, e.g., the original code, or > you need to duplicate the read statement. While both of these are > legal I don't like either. They both seem inelegant. "Seem" being the operative term. There's nothing wrong with writing the 'readLine()' assignment twice, since that is what purchases the scope confinement for the 'line' variable. -- Lew Don't quote sigs. Lew |
|
|
|
#9 |
|
Posts: n/a
|
On Nov 5, 9:21 am, Lew <no...@lewscanon.com> wrote:
> Tom McGlynn wrote: > > The problem with this idiom for me is that you have a choice of either > > having a statement that has side effects, e.g., the original code, or > > you need to duplicate the read statement. While both of these are > > legal I don't like either. They both seem inelegant. > > "Seem" being the operative term. > > There's nothing wrong with writing the 'readLine()' assignment twice, since > that is what purchases the scope confinement for the 'line' variable. > For me duplication of code is almost always inelegant and even slightly dangerous. There's always the chance that there could be unintended inconsistencies between the two instances--especially when code gets modified. I make no claim that this is a massive issue, but neither is the suggested change very large. As with the for statement it allows restricting the scope of the variables used in the loop. Given that it's not currently valid it is naturally less familiar than currently legal idioms. The particular syntax I used is the result of at least 30 seconds of thought: there is likely something better, I was interested in the idea not the particular implementation. The proposal would address a fairly broad class of loops: whenever the loop is to be terminated based upon some expression, and the value of that expression is also needed within the loop. Regards Tom McGlynn Tom McGlynn |
|
|
|
#10 |
|
Posts: n/a
|
Lew wrote:
>> There's nothing wrong with writing the 'readLine()' assignment twice, since >> that is what purchases the scope confinement for the 'line' variable. Tom McGlynn wrote: > For me duplication of code is almost always inelegant and even > slightly dangerous. There's always the chance that there could be > unintended inconsistencies between the two instances--especially when > code gets modified. I make no claim that this is a massive issue, but > neither is the suggested change very large. Copy-and-paste avoids divergence of the duplicated expressions. Since I don't have a problem with the idiom the OP wrote about, I usually do this: for ( String line; (line = reader.readLine()) != null; ) { ... } This limits the scope of 'line', avoids curly-brace explosion and avoids unnecessary duplication of code, much like your proposed 'while' syntax except that it's legal. -- Lew Lew |
|
![]() |
| Thread Tools | Search this Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Re: Spell checker. | S/B 954RR | Computer Support | 2 | 02-04-2009 01:01 PM |
| MSN Messenger Block Checker and Yahoo Block Checker | mianriz | Software | 0 | 07-30-2006 09:22 AM |
| Spell Checker | dah_dah | Computer Support | 6 | 07-24-2005 06:57 PM |
| Spell Checker | dah_dah | Computer Support | 2 | 07-21-2005 11:20 PM |
| Spell checker | Colin Williams | Computer Support | 5 | 08-17-2003 08:08 PM |