获取调用方法的行号?

11

有没有方法可以在Java中获取调用者方法的行号?我不想抛出异常。我必须使用堆栈跟踪吗?有没有一种便宜的方法来实现这个目标?

编辑:为了澄清,我不想要调用者类的行号,我想要方法被调用的确切行号。

2个回答

22
< p > < em >Aasmund< /em >提供的答案可行,但使用< /p > < p >< code >Thread.getStackTrace()< /code >比< code >Exception.getStackTrace()< /code >更好,因为您实际上并不关心异常。

从实际角度来看,这并没有太大的区别,但您的代码将更清晰地反映您的意图。

int callersLineNumber = Thread.currentThread().getStackTrace()[1].getLineNumber();

你的答案更好的另一个实际原因是它避免了创建新的异常对象。 - Nathan Brown
8
请注意,这将显示当前方法的行号。如果你想要显示调用该方法的行号,你需要使用getStackTrace()[2] - Nathan Brown
@NathanBrown - 实际上,它并不是这样的。看一下Thread.getStackTrace()的实现。 - Doradus

2

您不需要真正地抛出异常;只需创建一个即可:

int callersLineNumber = new Exception().getStackTrace()[1].getLineNumber();

请注意,这不需要使用 try/catchthrows 声明。

1
这不太贵吗?(这是用于日志记录的,我宁愿它尽可能便宜) - nulldev
1
这不是一个琐碎的操作,但我非常确定构建堆栈跟踪所需的信息随时都可以在JVM中轻松获取。然而,只有您自己可以判断它是否对您来说太昂贵:尝试并测量它。(此外,即使将执行日志语句的时间从10微秒增加到100微秒,考虑一下相对于应用程序正在执行的操作而言,那额外的90微秒有多重要。) - Aasmund Eldhuset
@nulldev 是的,没错,但这也是唯一的选择,并且它还假定之前的代码是使用调试标志编译的 ;) - MadProgrammer
好的,无论如何还是谢谢您: ) ,我本来希望不必使用此方法,因为大家总是告诉我异常很昂贵之类的。 - nulldev
1
@nulldev:“昂贵”是一个相对的词(因此需要测量建议):创建和抛出异常都比递增“int”慢,但比从文件读取快。因此,这取决于您正在做什么,并且除非您有证据证明它太慢,否则不要回避预期的操作方式。 - Aasmund Eldhuset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接