何时未指定的表达式是有效的语句?

时间:2015-09-04 20:23:53

标签: java

我已阅读Oracle's expressions tutorial并且无法理解这一点。

众所周知,以下代码行是有效的Java语法:

new Object();

然而,当我用原始表达式尝试这个时:

(3 + 2);

Eclipse显示编译错误"作业的左侧必须是变量"。

这不仅适用于基元,也适用于字符串文字:

"arbitraryString";

那么,未分配的表达式作为Java代码行有效的规则是什么?

4 个答案:

答案 0 :(得分:30)

该规则位于Java Language Specification

  

某些类型的表达式可以用分号跟随它们作为语句。

     

ExpressionStatement:

     
      
  • StatementExpression;
  •   
     

StatementExpression:

     
      
  • 分配
  •   
  • PreIncrementExpression
  •   
  • PreDecrementExpression
  •   
  • PostIncrementExpression
  •   
  • PostDecrementExpression
  •   
  • 的MethodInvocation
  •   
  • ClassInstanceCreationExpression
  •   

您看到构造函数调用是一个语句。但字符串文字或数学表达式不是。

答案 1 :(得分:9)

创建一个对象或调用或方法可能会产生副作用,我认为这是造成这种情况的主要原因,而算术表达式则不会发生任何事情。

答案 2 :(得分:5)

仅包含

的行
new Object(); 

或者更准确

new SomeClass(); 

是可以接受的,因为SomeClass()构造函数的代码可能是我们想要的

但是如果只包含

的行
"foo";

2;//or (2+3);

编译器知道除了创建/重用String literal或integer literal之外,这段代码不会做任何其他事情,这意味着它可能是某种程序员错误,因此编译器无法接受它。

答案 3 :(得分:5)

您正在寻找表达式和表达式语句之间的区别。像myVoid();这样的陈述可以写成一个陈述:这些是无效方法等(这是你知道的部分)。表达式(如(3 + 2);"arbitraryString")没有副作用。它们只能被视为一个值,因为没有代码被执行。表达式语句(如new Object();)可能有副作用并执行代码,有时您只需要执行此代码并忽略返回的值。因此编译器允许这样做。