资讯专栏INFORMATION COLUMN

空行会影响 Java 编译吗?

lcodecorex / 906人阅读

摘要:看到这建议大家动手试一试,并思考下原因答案其实答案很简单,豁然开朗你觉得为什么报错时会抛出具体的报错行数信息,其实会去记录行数,以便调试。

简评:往往越简单的问题越容易被人们忽略。
问题

这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出:
当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文件?

现在有一个 Java 类

public class HelloWorld {
  public static void main(String []args) {
  }
}

先对这个类编译出来字节码 .class 文件进行 sha256 转译得到

9c8d09e27ea78319ddb85fcf4f8085aa7762b0ab36dc5ba5fd000dccb63960ff  HelloWorld.class

接着在同个 Java 类中增加空行

public class HelloWorld {

  public static void main(String []args) {
  }
}

再次对编译后的字节码文件做 sha256 转译得

11f7ad3ad03eb9e0bb7bfa3b97bbe0f17d31194d8d92cc683cfbd7852e2d189f  HelloWorld.class

天哪,它们竟然不一样,难道空行会影响代码的运行吗。

当然空行不会影响代码的运行,那为什么会编译出不一样的 .class 字节码文件呢。

分析

当我把这个问题抛给身边的程序猿朋友,
大家首先使用 base64 对文件转译同样得出了不一样的数据;
咦,不对,base64 会不会算入了文件的编译时间等文件信息;
好,测试 MD5 加密 .class 文件还是不一样的数据;
大家开始觉得是编译器出错了,按道理应该优化空行的。

看到这建议大家动手试一试,并思考下原因
···
···
···

答案

其实答案很简单,豁然开朗:

你觉得为什么报错时 Java 会抛出具体的报错行数信息,其实 Java 会去记录行数,以便 debug 调试。

往往越简单的问题越容易被人们忽略。

原文链接:Why does a Java class compile differently with a blank line?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72163.html

相关文章

  • Java8(1):当 Lambda 遇上受检异常

    摘要:如果的流式操作中多几个需要抛出受检异常的情况,那代码真是太不直观了,所以为了的,我们需要解决的办法。不过既然受检异常已经是中的客观存在的事物,所谓道高一尺,魔高一丈总是会有办法来应对。 我今天高高兴兴,想写个简单的统计一个项目下有多少行代码的小程序,于是咔咔的写下: long count = Files.walk(Paths.get(D:/Test)) ...

    lavor 评论0 收藏0
  • 一小段java代码——去掉文本中的多余空格和空行

    摘要:前言最近在开发一个小型的圈子系统。功能类似一个简化的微博。产品大哥要求我立即开发一套过滤逻辑,删除多余的空格和帖子。和都需要处理实现移除多余空行和空格移除行中的多余空格呵呵测试将风控打扫房间快递费解封时代峰峻发的几点睡 前言 最近在开发一个小型的圈子系统。功能类似一个简化的微博。用户可以在圈子里发帖子,回复帖子,点赞等等。项目上线不久就发现有很多用户在圈子里发广告,手段之丰富令人叹为观...

    williamwen1986 评论0 收藏0
  • Java 使用JAR文件

    摘要:使用文件与以下好处安全。包作为内嵌在平台内部处理的标准,能够在各种平台上直接使用命令详解创建文件该命令没有显示压缩过程,执行结果是将当前路径下的路径下的全部内容生成一个文件。使用如下命令即可将清单文件中的对提取到文件中。 JAR,Java Archive File,Java档案文件。JAR文件是一种压缩文件,与ZIP压缩文件兼容,通常称为JAR包。JAR文件中默认包含了一个名为META...

    seal_de 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<