Re: Stranger compiler error?
Patricia Shanahan wrote:
Knute Johnson wrote:
...
for (Enumeration<Integer> e=hash.keys(); e.hasMoreElements();)
String[] array = hash.get(e.nextElement()); // <---- error
...
You are confusing two very different entities, a statement and a
variable declaration.
The for MUST be followed by a statement.
You have a local variable declaration, which is not itself a statement
but can appear in a compound statement, such as a brace-enclosed block.
I understand the issue here I just can't find in the JLS where it is not
a statement. In fact, JLS 14.4.4 Execution of Local Variable
Declarations "A local variable declaration statement is an executable
statement.", would seem to say otherwise.
Incidentally, it seems a bit pointless because you assign to array and
then immediately leave its scope of declaration.
Yes.
C:\com\knutejohnson\redrock\scores>javac test1.java
test1.java:10: '.class' expected
String[] array = hash.get(e.nextElement());
^
test1.java:10: not a statement
String[] array = hash.get(e.nextElement());
^
2 errors
The first error message shows what happened when the compiler tried to
interpret the first few tokens as a statement, not a declaration.
"String[]" is not very likely as the start of a statement, but it could
have been something like "String[].class.notifyAll();". Not finding
".class" killed that idea.
The second message points out that it is not a statement, which is the
real problem.
Patricia
I think I found it - 14.4 Local Variable Declaration Statements
"Every local variable declaration statement is immediately contained by
a block. Local variable declaration statements may be intermixed freely
with other kinds of statements in the block."
This is a pretty subtle distinction but I can see the light now.
I can't think of a real situation where you would not have other code
mixed with the local variable declaration. Since you would then need an
enclosing block the error would never occur.
Thanks,
--
Knute Johnson
email s/nospam/knute/