文档章节

空行会影响 Java 编译吗?

极光开发者服务
 极光开发者服务
发布于 07/25 10:56
字数 502
阅读 3
收藏 0

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

问题

这个月的 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?

© 著作权归作者所有

极光开发者服务
粉丝 43
博文 240
码字总数 257306
作品 1
深圳
个人站长
私信 提问
空行会影响 Java 编译吗?

简评:往往越简单的问题越容易被人们忽略。 这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出:当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文件? 现在...

极光推送
2018/11/14
18
0
别用 Java 7 ? 你是在开玩笑吗?

Java 7 刚刚发布没两天,但来自 Lucene 和 Solr 社区的某些人立即报料了一些 Java 7 中的严重bug。甚至 Apache Lucene 项目管理委员会成员 Uwe Schindler 发布了暂时不要使用 Java 7 的警告信...

红薯
2011/08/02
6.1K
28
《俗人笔记》之《Java基础语法上》

基础前言: 二进制: 十进制转二进制:使用除以2获取余数来算 二进制转十进制:按8421编码 字节: 最小的存储单位是字节,最小的信息单位是位(bit) 1B=8bit 1KB=1024B 依次类推 DOS命令 盘符...

钱无极
2018/12/10
0
0
ARM硬件支持java技术Jazelle DBX

arm硬件支持java技术Jazelle DBX Java已 经在各个领域得到了广泛的应用,尤其是无线移动领域,全球超过100个移动运营商已经推出了Java下载服务。Java也正成为其它嵌入式设备的支持标 准,如机...

长平狐
2013/06/03
467
0
hadoop2.6.0安装配置

注意: 1.有关core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml的配置,参考:hadoop2.x的配置 2.有关hadoop的命令,参考:hadoop2.x的命令 3.先修改一台机器的配置文件,剩余...

cjun1990
2015/03/25
140
0

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部