1. ホーム

[解決済み】Javaのクラスが空白行でコンパイルが異なるのはなぜですか?

2022-04-10 01:17:01

質問

次のようなJavaクラスがあります。

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

このファイルをコンパイルして、できたクラスファイルに対してsha256を実行すると、次のような結果が得られます。

9c8d09e27ea78319ddb85fcf4f8085aa7762b0ab36dc5ba5fd000dccb63960ff  HelloWorld.class

次にクラスを修正し、このように空白行を追加しました。

public class HelloWorld {

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

もう一度、出力に対してsha256を実行し、同じ結果を得ることを期待しましたが、その代わりに次のような結果が得られました。

11f7ad3ad03eb9e0bb7bfa3b97bbe0f17d31194d8d92cc683cfbd7852e2d189f  HelloWorld.class

を読みました。 このTutorialsPointの記事 ということです。

空白だけを含む行、場合によってはコメントも含む行は空白行と呼ばれ、Javaはこれを完全に無視します。

そこで質問ですが、Javaは空白行を無視するので、なぜ両プログラムのコンパイルされたバイトコードは異なるのでしょうか?

つまり HelloWorld.class a 0x03 バイトは 0x04 バイトになります。

どのように解決するのですか?

基本的に行番号はデバッグのために保持されているので、ソースコードを変更した場合、メソッドの開始行が異なり、コンパイルされたクラスにはその差が反映されます。