zoukankan      html  css  js  c++  java
  • 空行会影响 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?

  • 相关阅读:
    【poj1733】 Parity game
    【poj1018】 Communication System
    【poj1017】 Packets
    【poj1568】 Find the Winning Move
    【poj1085】 Triangle War
    【bzoj1082】 SCOI2005—栅栏
    【codevs1086】 栈
    【bzoj3240】 Noi2013—矩阵游戏
    【bzoj1951】 Sdoi2010—古代猪文
    中国剩余定理学习笔记
  • 原文地址:https://www.cnblogs.com/jpush88/p/9956378.html
Copyright © 2011-2022 走看看