空行会影响 Java 编译吗?
简评:往往越简单的问题越容易被人们忽略。
问题
这个月的 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?
空行会影响 Java 编译吗?的更多相关文章
- Java编译过程、c/c++编译过程区别
Java编译原理 1.Java编译过程与c/c++编译过程不同 Java编译程序将java源程序编译成jvm可执行代码--java字节码. c/c++编译过程: 当C编译器编译生成一个对象的代码时,该 ...
- Java编译原理
http://wenku.baidu.com/view/f9b1734b87c24028915fc3a3.html Java编译原理 1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想 ...
- Java编译后产生class文件的命名规则
今天刚好有同学问了下Java编译后产生的.class文件名的问题,虽然一直都在使用Java做开发,但是之前对编译后产生的.class文件名的规范也基本没做了解过,也真的是忏愧啊!今天无论如何都要总结下 ...
- (转)Java编译后产生class文件的命名规则
今天刚好有同学问了下Java编译后产生的.class文件名的问题,虽然一直都在使用Java做开发,但是之前对编译后产生的.class文件名的规范也基本没做了解过,也真的是忏愧啊!今天无论如何都要总 ...
- 将Java编译为本地代码
将Java编译为本地代码 通常Java程序的执行流程为:将Java代码编译为Byte Code(字节码),然后JVM执行引擎执行编译好的Byte Code.这是一种中间语言的特性,它的好处就是可以做到 ...
- 15个问题自查你真的了解java编译优化吗?
摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...
- java编译后字节码解析
java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260
- 影响Java EE性能的十大问题(转)
本文作者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.他在性能优化和提升方面也有很深刻的见解,下面他将和大家分享一下常见的10个影响Java EE性能问题 ...
- JAVA - JAVA编译运行过程
Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...
随机推荐
- Could not load TestContextBootstrapper [null]
在对SpringBoot进行单元测试时,报错“Could not load TestContextBootstrapper [null]” 错误原因: Maven的pom.xml中某些SpringBo ...
- nasm 与 masm语法区别
看到一篇文章,是介绍nasm语法的:http://blog.csdn.net/hitop0609/article/details/4329454 masm是微软专门为windows下汇编而写的,而na ...
- 阿里云自定义监控tomcat进程数
阿里云提供自定义监控SDK,这有助于我们定制化的根据自身业务来做监控,下面我就根据业务需求来介绍一个简单的自定义监控配置. 阿里提供了2个版本的自定义监控接口:自定义监控SDK(python版) :c ...
- Golang学习系列:(一)介绍和安装
Golang学习系列:(一)介绍和安装 Java程序员带你来到Go的世界,让我们开始探索吧! Go是一种新的语言,一种并发的,带有垃圾回收的.快速编译的语言,它具有一下特点: 他可以在一台计算机上用几 ...
- linux环境下pdo加载问题
报错信息信息 PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20121212/pdo_mysql.so ...
- 利率计算v2.0--web版--软件工程
.客户说:帮我开发一个复利计算软件. .如果按照单利计算,本息又是多少呢? .假如30年之后要筹措到300万元的养老金,平均的年回报率是3%,那么,现在必须投入的本金是多少呢? .利率这么低,复利计算 ...
- idea中处理异常的快捷键
alt+Enter
- SpringBoot配置Druid
Druid是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能.关于详细介绍可查看http://www.iteye.com/magazines/90 SpringBoot中集成D ...
- web端跨域调用webapi(转)
在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...
- 前端福利之个性化设置table的td宽度(总结)
很多时候,我们在用到table时,都希望随意设置 每个单元格的宽度,而不希望单元格被内容撑开table的样式. 1.首先,设置table的宽度 width=“1000” 或者 width=“100%” ...