【问题标题】:Why is "while((String tmp=x))" not valid Java syntax?为什么“while((String tmp=x))”不是有效的 Java 语法?
【发布时间】:2013-04-14 02:16:44
【问题描述】:

我对一些 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();
    }

}

不工作

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();
    }

}

Eclipse的错误是:

这一行有多个标记:

  • 字符串无法解析为变量
  • 标记“tmp”的语法错误,删除此标记
  • 字符串无法解析为变量
  • 标记“tmp”的语法错误,删除此标记

【问题讨论】:

    标签: java syntax


    【解决方案1】:

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

    【讨论】:

    • for 循环的第一部分是 LocalVariableDeclaration StatementList,因此在这种情况下甚至不会违反它(不能在表达式中声明)。 .
    • 没错,但我认为 OP 想知道为什么不允许这样做。
    • 没错,我对 Silox 提到的“为什么”这个问题很感兴趣。
    【解决方案2】:

    JLS §14.12:

    WhileStatement:
        while ( Expression ) Statement
    

    JLS §15.27

    Expression:
        AssignmentExpression
    

    JLS §15.26

    AssignmentExpression:
        ConditionalExpression
        Assignment
    
    Assignment:
        LeftHandSide AssignmentOperator AssignmentExpression
    
    LeftHandSide:
        ExpressionName
        FieldAccess
        ArrayAccess
    

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

    【讨论】:

    • 我什至不确定它是否在生产规则中如此深入......但这些规则确实解释了为什么生产最终无效。 +1。
    【解决方案3】:

    您正在混合使用 for 和 while 语法。 第二个块不起作用,因为您在条件内声明 tmp 变量。

    while((String tmp=scan.next())!=null)

    试试这个:

    String tmp; while((tmp=scan.next())!=null)

    【讨论】:

    • 我知道如何解决它,但我想了解 java 语法
    • try this 部分正是他在他的工作示例中所拥有的!
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2023-01-06
    • 2020-08-15
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多