Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java编译器会给出不连贯的“quot;。“预期类别”;编译错误?_Java_If Statement - Fatal编程技术网

为什么Java编译器会给出不连贯的“quot;。“预期类别”;编译错误?

为什么Java编译器会给出不连贯的“quot;。“预期类别”;编译错误?,java,if-statement,Java,If Statement,如果我有这样一段代码: public class ABC { public static void main(String[] args) { if (true) int a = 0; } } 当我编译它时,Java编译器会产生一个错误 .我要上课 我知道当我们不使用大括号时,我们只能在if之后使用一条语句 我也知道我将不能使用int变量a,因为只要时,程序将退出if,变量a将失去其作用域 我对该代码发出错误并不感到惊讶,但是为什么会

如果我有这样一段代码:

public class ABC {
    public static void main(String[] args) {
        if (true)
            int a = 0;
    }
}
当我编译它时,Java编译器会产生一个错误

.我要上课

  • 我知道当我们不使用大括号时,我们只能在
    if
    之后使用一条语句
  • 我也知道我将不能使用
    int
    变量
    a
    ,因为只要
    时,程序将退出
    if
    ,变量
    a
    将失去其作用域
我对该代码发出错误并不感到惊讶,但是为什么会出现错误消息'.class'

Java编译器想说什么

与我们所说的相反,此代码实际上会产生该错误

int a = 0;
    ^
根据Java语言规范,变量声明需要位于代码块中:

每个局部变量声明语句都立即包含在一个块中。局部变量声明语句可以与块中其他类型的语句自由混合

我想你已经知道了

但是.class为什么会出现预期错误?
异常显示为.class的原因是特定于编译器的。其他编译器不会发出语句或表达式的非法开头

我猜想这与编译器计算代码的方式有关。
int
在该位置有效的唯一方法是后跟
.class
。因此,一旦检测到标记
int
,编译器希望它后面跟着
.class

比如说,

if (true)
    int.class.getFields();
这将是一个有效的声明

因此,编译器给出了一个在某种程度上符合逻辑的错误,即应为.class。
其他编译器可能将整个语句作为变量声明进行评估,而不是像
int
a
=
0
这样的单独标记

特定编译器
我不知道tutorialspoint.com正在使用哪个特定的编译器,但是他们的javac版本(使用
javac-version
)是
Fedora release 21(二十一版)
(使用命令
cat/etc/issue.net
)上的
javac 1.7.075

PS:我不知道您是否有特定的理由使用发布了映像的编译器,但我建议您开始使用Eclipse或Netbeans。

与上面所说的相反,此代码实际上可能会产生该错误

int a = 0;
    ^
根据Java语言规范,变量声明需要位于代码块中:

每个局部变量声明语句都立即包含在一个块中。局部变量声明语句可以与块中其他类型的语句自由混合

我想你已经知道了

但是.class为什么会出现预期错误?
异常显示为.class的原因是特定于编译器的。其他编译器不会发出语句或表达式的非法开头

我猜想这与编译器计算代码的方式有关。
int
在该位置有效的唯一方法是后跟
.class
。因此,一旦检测到标记
int
,编译器希望它后面跟着
.class

比如说,

if (true)
    int.class.getFields();
这将是一个有效的声明

因此,编译器给出了一个在某种程度上符合逻辑的错误,即应为.class。
其他编译器可能将整个语句作为变量声明进行评估,而不是像
int
a
=
0
这样的单独标记

特定编译器
我不知道tutorialspoint.com正在使用哪个特定的编译器,但是他们的javac版本(使用
javac-version
)是
Fedora release 21(二十一版)
(使用命令
cat/etc/issue.net
)上的
javac 1.7.075


PS:我不知道您是否有特定的理由使用发布图像的编译器,但我建议您开始使用Eclipse或Netbeans。

我怀疑问题在于,在这种情况下,唯一可以合法跟随
int
关键字标记的标记序列是
后跟
class
。您目前得到的声明语句无效,因为局部变量声明本身不是符合的语句。(这是一个封锁性声明。)

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

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

为什么是
.class
这件事?如果您知道
int
后跟
.class
可以编译的任何情况,请告诉我

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

public class ABC
{
    public static void main(String args[])
    {
        if(true)
            int.class.getName();
    }
}
这不是有用的代码,但它是有效的代码。它为我编译,没有警告或错误


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

我怀疑问题在于,在这种情况下,唯一可以合法地跟随
int
关键字标记的标记序列是
后跟
class
。您目前得到的声明语句无效,因为局部变量声明本身不是符合的语句。(这是一个封锁性声明。)

请注意,在注释中引用的tutorialspoint环境中,如果使用类而不是
int
,则会出现不同的