Java如何处理丢失值

Bri*_*acy 1 java arraylist semantics

我的AP计算机科学教科书指出接口中的add()方法List总是返回true,但是当调用此方法时,不必分配其返回类型.

在此输入图像描述

我假设该值被丢弃,因为在这种情况下它没有分配给任何东西.这引出了一个问题,在这种情况下,价值被"抛弃".例如,以下内容无法编译.

在此输入图像描述

为什么第二个片段在与第一个片段基本上留下相同的值时不能编译?(list.add()回报true,(1 < 2)收益率true).

Ell*_*sch 6

返回值可以忽略.不完整的表达仍然不完整.你可以把它分配给一个变量(并且永远不会再引用它) - 这会"扔掉"这个值(eclipse会警告你,但这不是错误) -

// This is legal, note that a is never referenced after assignment.
public static void main(String[] args) {
  boolean a = (1 < 2);
}
Run Code Online (Sandbox Code Playgroud)


rge*_*man 5

代码块可以包含语句,但不能包含表达式. JLS的第14.2节定义了内部块的内容,并且不允许表达式本身.

块:

  • {[BlockStatements]}

BlockStatements:

  • BlockStatement {BlockStatement}

块语句:

  • LocalVariableDeclarationStatement

  • ClassDeclaration

  • 声明

(强调我的)

一种可能的语句是方法调用,因此未分配返回值的方法调用是一个语句,但表达式本身不是语句.

JLS的第14.5节将声明定义为以下之一:

声明: - StatementWithoutTrailingSubstatement

  • LabeledStatement

  • IfThenStatement

  • IfThenElseStatement

  • WhileStatement

  • ForStatement

StatementNoShortIf:

  • StatementWithoutTrailingSubstatement

  • LabeledStatementNoShortIf

  • IfThenElseStatementNoShortIf

  • WhileStatementNoShortIf

  • ForStatementNoShortIf

StatementWithoutTrailingSubstatement:

  • EmptyStatement

  • ExpressionStatement

  • AssertStatement

  • SwitchStatement

  • DoStatement

  • BreakStatement

  • Continue语句

  • ReturnStatement

  • SynchronizedStatement

  • ThrowStatement

  • TryStatement

(强调我的)

JLS的第14.8节定义了"表达式声明":

ExpressionStatement:

  • StatementExpression;

  • StatementExpression:

  • 分配

  • PreIncrementExpression

  • PreDecrementExpression

  • PostIncrementExpression

  • PostDecrementExpression

  • 的MethodInvocation

  • ClassInstanceCreationExpression

(强调我的)

表达式本身不是表达式语句或语句.