Java如何处理丢失值

时间:2014-05-30 20:46:12

标签: java arraylist semantics

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

enter image description here

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

enter image description here

为什么第二个片段在基本上留下与第一个片段相同的值时无法编译? (list.add()返回true(1 < 2)返回true)。

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

代码块可以包含语句,但不能包含表达式。 Section 14.2 of the JLS定义了块内部的内容,并且不允许表达式。

  

块:

     
      
  • {[BlockStatements]}
  •   
     

BlockStatements:

     
      
  • BlockStatement {BlockStatement}
  •   
     

块语句:

     
      
  • LocalVariableDeclarationStatement

  •   
  • ClassDeclaration

  •   
  • <强>声明

  •   

(强调我的)

一个可能的语句是方法调用,因此返回值未被赋值的方法调用是一个语句,但表达式本身不是语句。

Section 14.5 of the JLS将语句定义为以下之一:

  

声明:    - StatementWithoutTrailingSubstatement

     
      
  • LabeledStatement

  •   
  • IfThenStatement

  •   
  • IfThenElseStatement

  •   
  • WhileStatement

  •   
  • ForStatement

  •   
     

StatementNoShortIf:

     
      
  • StatementWithoutTrailingSubstatement

  •   
  • LabeledStatementNoShortIf

  •   
  • IfThenElseStatementNoShortIf

  •   
  • WhileStatementNoShortIf

  •   
  • ForStatementNoShortIf

  •   
     

StatementWithoutTrailingSubstatement:

     
      
  • 阻止

  •   
  • EmptyStatement

  •   
  • <强> ExpressionStatement

  •   
  • AssertStatement

  •   
  • SwitchStatement

  •   
  • DoStatement

  •   
  • BreakStatement

  •   
  • ContinueStatement

  •   
  • ReturnStatement

  •   
  • SynchronizedStatement

  •   
  • 投掷声明

  •   
  • TryStatement

  •   

(强调我的)

Section 14.8 of the JLS定义了一个&#34;表达式语句&#34;:

  

ExpressionStatement:

     
      
  • StatementExpression;

  •   
  • StatementExpression:

  •   
  • 作业

  •   
  • PreIncrementExpression

  •   
  • PreDecrementExpression

  •   
  • PostIncrementExpression

  •   
  • PostDecrementExpression

  •   
  • <强>的MethodInvocation

  •   
  • ClassInstanceCreationExpression

  •   

(强调我的)

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

答案 2 :(得分:0)

<强> EDITED

调用返回值的方法具有意义,因为它不仅仅是返回值。在给定的示例方法中,将项添加到集合并返回它引用,因此可以进一步处理。

第二个例子是给你一个错误,因为没有将它的结果赋给变量它没有意义。它比dead code更糟糕。

理论上,第二个陈述不可能是一个错误,但为什么有人会想写这样的&#34;陈述&#34;?

表达式,字面上给出任何东西只是一个处理器消费者,一个错误,不应该在任何程序期间中使用。

(1<2);

可以很容易地转换为字节码,而且还可以转换为处理器指令,例如

PUSH EAX;
PUSH EBX;
PUSHF;
MOV EAX, 1;
MOV EBX, 2;
CMP EAX,EBX;
POPF;
POP EBX;
POP EAX;

甚至更简单

PUSHF;
CMP 1,2;
POPF;

只有上面代码会改变的是增加寄存器指向内存中的下一个代码(以及其他几个代码)。那么为什么有人会执行这样的线?

答案 3 :(得分:0)

生成的编译错误与java语法有关。 Java语法声明java函数的主体包含语句序列。根据这个语法语句可以是任何赋值,方法调用,条件结构,循环等。但是&lt; b是一个逻辑表达式,不能作为语句假设。所以这是关于表达式和语句之间的区别,而不是抛出值。