为什么Java编译器会给出不连贯的".class expected"编译错误?

dry*_*hip 1 java if-statement

如果我有一段这样的代码:

public class ABC {
    public static void main(String[] args) {
        if (true)
            int a = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时,Java编译器会产生错误

.class预期.

  • 我知道当我们不使用大括号时,我们之后只能使用一个语句if.
  • 而且我也知道我将无法使用int变量a,因为一旦;遇到变量,程序就会出现if,并且变量a会失去它的范围.

我对此代码发出错误并不感到惊讶,但为什么错误消息".class"会出现

什么是Java编译器试图说的?

编译器错误的屏幕截图

Jon*_*eet 6

我怀疑问题是在这种情况下可以合法地遵循关键字令牌的唯一令牌序列后面跟着.您目前获得的声明声明无效,因为根据JLS 14,本地变量声明本身不是声明.(这是一个BlockStatement.)int.class

请注意,在注释中引用的tutorialspoint环境中,如果使用类而不是int,则会产生不同的错误 - 可能是因为该场景中的有效令牌集不同.(String.getClass();例如,有效,int.getClass();但不会.)

评论中提出了一个有效的问题:

为什么这个.class东西?如果你知道int随后.class可以编译的任何情况,那么请告诉我.

这很简单 - 您可以在Class返回的引用上调用方法int.class:

public class ABC
{
    public static void main(String args[])
    {
        if(true)
            int.class.getName();
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是有用的代码,但它是有效的代码.它在没有警告或错误的情况下为我编译.

正如评论中所提到的,更新的编译器版本会提供更多有用的错误 - 我建议升级.