Java:不是声明

时间:2013-05-16 23:36:20

标签: java semantics

我认为这更像是一个关于语言理论的问题。为什么第一个声明是主要法律,第二个声明不是?他们不认为是同一件事吗?

public class Main {
        public static void main(String[] args) {
                foo();
                0;
        }
        public static int foo(){
                return 0;
        }
}

2 个答案:

答案 0 :(得分:15)

Java限制了所谓的“表达式语句”中允许的表达式类型。只允许有潜在副作用的有意义的表达。它不允许使用语义无意义的语句,如0;a + b;。他们只是被排除在语言语法之外。

foo()这样的函数调用可以,而且通常会产生副作用,因此它不是无意义的陈述。编译器不会深入检查foo()的主体以检查它是否确实发生了任何事情。调用函数可以有副作用,因此它在语法上是有效的。

这反映了C / C ++和Java之间的哲学差异。 Java禁止各种导致死代码或无意义代码的构造。

return;
foo();    // unreachable statement
对于这一切,C和C ++相对自由放任。写下你想要的任何东西他们没有时间照顾你。


引用Java Language Specification, §14.8 Expression Statements

  

某些类型的表达式可以通过以下方式用作语句   他们用分号。

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression
     

通过计算表达式来执行表达式语句;如果   表达式有一个值,该值被丢弃。

     

表达式语句的执行只能正常完成   如果表达式的评估正常完成。

     

与C和C ++不同,Java编程语言只允许使用   表达式的形式,用作表达式语句。注意   Java编程语言不允许“转换为void” - void   不是一种类型 - 所以写一个表达式的传统C技巧   陈述如:

(void)... ;  // incorrect!
     

不起作用。另一方面,Java编程语言允许   表达式语句中所有最有用的表达式,   并且它不需要将方法调用用作表达式   声明调用void方法,所以这样的技巧几乎从不   需要。如果需要技巧,可以使用赋值语句(§15.26)   或者可以使用局部变量声明语句(第14.4节)。

答案 1 :(得分:0)

onSubmit() {
   this.submitted = true;
   const fd = new FormData();
   fd.append('avatar', this.selectedFile, this.selectedFile.name);

   this.auth.updateProfilePic(fd).subscribe((res: any)=>{

      this.imageUrl = res.data.file;
      console.log(this.imageUrl);

      this.auth.updateUser(this.updateForm.value).subscribe((res)=>{
         console.log(res);
      },(err)=>{
         console.log(err);
      });

   },(err)=>{
      console.log(err);
   });

}