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); } } }
ソースコード
- https://github.com/hirotoKirimaru/cucumber-sample/blob/1d0fff24e3712000e9399961b56616422174b1af/kirimaru-core/src/main/java/kirimaru/helper/Debug.java
- https://github.com/hirotoKirimaru/cucumber-sample/blob/1d0fff24e3712000e9399961b56616422174b1af/kirimaru-core/src/test/java/kirimaru/helper/DebugTests.java
終わりに
あまり使用する機会のない処理ではあります。
業務上、1000行近くの処理、10個くらいif文で処理をしなければいけない分岐ロジックを作ったのですが…。障害発生したときに、非常に処理を追うのがたいへんで心が折れてました。
この現在行もデバッグログに吐かせることで、どの処理分岐に入ったかを一目瞭然にできるようになりました。30分くらいかけて分岐を確認していたのが、10秒で済むようになって非常に楽になりました。
こういう運用面にもつながるようなログを出せる癖は身につけていきたいです。