语法错误:带有多个分号的Import语句

这可能是一个奇怪的问题,但却是一个有效的问题。 我知道下面的语句没有编译错误:

ArrayList list = new ArrayList();;; //(with three `;` semi-colon) 

好的,现在我写了下面的import语句:

 import java.util.ArrayList;;; (with three `;` semi-colon) 

但是我得到了以下编译错误:

 Syntax error on token ";", invalid StaticImportOnDemandDeclarationName 

为什么?

你有什么:

 ArrayList list = new ArrayList();;; //(with three `;` semi-colon) 

不是以三个分号结束的声明。 这是一个由一个分号结束的声明,后面是两个空的声明

空语句在Java中是合法的,但Java源文件的导入部分不包含语句,它由导入声明组成。

JLS 14.6定义了空语句:

空语句什么都不做。

  EmptyStatement: ; 

执行空语句总是正常完成。

可能合法使用空语句:

 //loop forever while (true) {;} // the body of this loop is an empty statement. 

换句话说,在第一个示例中,您有一个赋值后跟两个空语句。 分号不是严格多余的。

import部分有自己的语法,没有一个语法规则允许任意的分号。 语法由JLS 7.5指定:

 ImportDeclaration: SingleTypeImportDeclaration TypeImportOnDemandDeclaration SingleStaticImportDeclaration StaticImportOnDemandDeclaration SingleTypeImportDeclaration: import TypeName ; ... 

ArrayList list = new ArrayList();;; //(有三个;分号)

在第一个半冒号之后,接下来的两个分号代表空语句,这些只在类部分区域中是合法的,而不是在导入部分区域。

这就是为什么这会产生编译时错误

import java.util.ArrayList ;;; (有三个;分号)