Java中只允许在代码中保留分号。幕后发生了什么?编译器和JVM如何对待它们?

阿比舍克·辛格(Abhishek Singh)
public static void main(String[] args) {
    File dir = new File("dir");
    dir.mkdir();

    File file = new File(dir,"file.txt");;;;;
    ;
    ;
    ;
    try {
        file.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        ;
        ;
        ;
        ;
    }



}

编译器显示多余的分号没有错误。并且代码运行好像没有发生任何错误。我想知道幕后发生了什么?包括这样的分号是否会消耗更多的堆栈内存,从而需要更多的处理器周期才能运行?

Aioobe

我想知道幕后发生了什么?

;AST中有一个额外的内容作为跳过语句。

例如,在while循环中,通常使用它们来代替空主体:

while (expression)
    ;

包括这样的分号是否会消耗更多的堆栈内存,从而需要更多的处理器周期才能运行?

不,它不会显示在字节码中。(这就是为什么在调试时通常不能将它们用作break语句的原因。)


一些琐事:

您实际上可能之外具有skip语句

class MyClass {
    // ...
}

;;;;;

这些将被忽略,并且仅允许它们不惹恼来自C ++的人员,并且被用来放置;类:

class MyClass {
    // ...
};

资料来源:我是Oracle的编译器开发人员

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何在Java数组中添加键?幕后发生了什么

JVM JIT编译器如何优化“重复的” Java代码?

幕后发生了什么,所以代码返回 1 而不是 43?

在if语句的幕后发生了什么?

如何在我的编译器中运行Java代码

编译器如何对待lambda与常规函数不同?

JVM中的JIT编译器到底是什么?

Java编译器和JVM用哪种语言编写?

如何禁用编译器和JVM优化?

在增强的for循环的幕后发生了什么?

钻石继承的幕后发生了什么?

XCTest的@testable幕后发生了什么?

为什么Java编译器会生成奇怪的局部变量和堆栈映射框架,以及如何使用它们可靠地确定变量类型?

如何在Cheerp中保留变量名(从C ++到JavaScript的编译器)

这段Java代码中发生了什么?

为什么IntelliJ可以检测到缺少的分号而Java编译器无法检测到?

为什么Java编译器不重写此代码?

对于Java和C编译器,代码的行为如何不同?

为什么编译器将数据放在PE和ELF文件的.text(code)部分中,并且CPU如何区分数据和代码?

停止Typescript编译器将分号放入src中

Java编译器如何确定无法访问的代码?

幕后发生了什么,在尝试 git reset --soft 并撤消它时提交和 HEAD?

在汇编“ push”,“ pop”,“ call”和“ ret”操作的幕后究竟发生了什么?

Android中的Java代码编译器优化

此代码如何在编译器中执行?

为什么Java编译器允许在throws部分中列出异常,而方法无法抛出该异常

如何相应地构建代码(在头文件和源文件中),以免出现编译器和链接器错误?

我怎样才能看到Scala编译器在什么[Java / Scala?]代码中重写了原始的Scala代码

在Scala中添加不可变集合时,幕后发生了什么?