文档章节

空行会影响 Java 编译吗?

极光推送
 极光推送
发布于 2018/11/14 09:52
字数 502
阅读 18
收藏 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?

© 著作权归作者所有

极光推送
粉丝 42
博文 240
码字总数 257306
作品 1
深圳
个人站长
私信 提问
别用 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
459
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
133
0
你的 Java 代码对 JIT 编译友好么?

JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一。但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度。 在...

oschina
2015/09/06
7.4K
12

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
6
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
8
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部