为什么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
遇到code>时,程序将退出
,变量if
将失去其作用域a
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
,则会出现不同的