为什么"while((String tmp = x))"不是有效的Java语法?

Dav*_*d H 8 java syntax

我对一些Java代码有一个澄清:

这些代码之间的区别是什么,一个可以编译而另一个不能编译.

我对"如何修复错误"不感兴趣,因为我已经解决了它,但更多的是关于这个问题的解释:

工作

public void  x(){
    HashMap<String , Integer> count= new HashMap<String, Integer>();
    Scanner scan= new Scanner("hdsh");

    String tmp;
    while((tmp=scan.next())!=null){
        if(count.containsKey(tmp)){
            count.put(tmp, 1);
        }
        else{
            count.put(tmp, count.get(tmp)+1);
        }
         tmp=scan.next();
    }

}
Run Code Online (Sandbox Code Playgroud)

不工作

public void  x(){
    HashMap<String , Integer> count= new HashMap<String, Integer>();
    Scanner scan= new Scanner("hdsh");

    while((String tmp=scan.next())!=null){
        if(count.containsKey(tmp)){
            count.put(tmp, 1);
        }
        else{
            count.put(tmp, count.get(tmp)+1);
        }
         tmp=scan.next();
    }

}
Run Code Online (Sandbox Code Playgroud)

Eclipse的错误是:

此行有多个标记:

  • 字符串无法解析为变量
  • 令牌"tmp"上的语法错误,删除此令牌
  • 字符串无法解析为变量
  • 令牌"tmp"上的语法错误,删除此令牌

SLa*_*aks 12

您不能在表达式中声明变量.(for循环的第一部分除外)


Jef*_*rey 10

JLS§14.12:

WhileStatement:
    while ( Expression ) Statement
Run Code Online (Sandbox Code Playgroud)

JLS§15.27

Expression:
    AssignmentExpression
Run Code Online (Sandbox Code Playgroud)

JLS§15.26

AssignmentExpression:
    ConditionalExpression
    Assignment

Assignment:
    LeftHandSide AssignmentOperator AssignmentExpression

LeftHandSide:
    ExpressionName
    FieldAccess
    ArrayAccess
Run Code Online (Sandbox Code Playgroud)

LeftHandSide 不能是声明,所以不允许.