きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaで現在行を取得する

Javaで現在行を取得する方法を記載します。

環境

  • Java
    • 17

対応

現在スレッドのlineNumberを取得すれば、現在行が取得できます。

return Thread.currentThread().getStackTrace()[2].getLineNumber();
  • 0番目
    • Threadクラス
  • 1番目
    • この処理している行
  • 2番目
    • 呼び出し元の行

他にも、クラス名getClassName()、メソッド名getMethodNameも取得できるので、デバッグ文言を加工したいときは利用できます。

テストクラス

実装クラスは、interfaceのdefaultメソッド、staticメソッドの両方とも用意しました。

public interface Debug {
  default int getLineNo() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
  }
}
public class DebugUtil {
  public static int getLineNo() {
    return Thread.currentThread().getStackTrace()[2].getLineNumber();
  }
}

interfaceのテストはインスタンス化しないといけないので、ちょっとだけ工夫が必要です。

class DebugTests {
  public class TestClass implements Debug {
  }

  @Nested
  class LineNo {
    @Test
    void test_01() {
      assertThat(
          new TestClass().getLineNo()
      ).isEqualTo(18);
    }

    @Test
    void test_02() {
      assertThat(
          DebugUtil.getLineNo()
      ).isEqualTo(25);
    }
  }
}

ソースコード

終わりに

あまり使用する機会のない処理ではあります。

業務上、1000行近くの処理、10個くらいif文で処理をしなければいけない分岐ロジックを作ったのですが…。障害発生したときに、非常に処理を追うのがたいへんで心が折れてました。

この現在行もデバッグログに吐かせることで、どの処理分岐に入ったかを一目瞭然にできるようになりました。30分くらいかけて分岐を確認していたのが、10秒で済むようになって非常に楽になりました。

こういう運用面にもつながるようなログを出せる癖は身につけていきたいです。