在groovy应用程序中获取StackTraceeElement

在groovy应用程序中获取StackTraceeElement,groovy,Groovy,我有一段代码,用于打印当前的java文件以用于日志记录 final StackTraceElement stackTraceElement = new Throwable().fillInStackTrace().getStackTrace()[2]; final String parentClassName = stackTraceElement.getFileName().replaceAll(".java", ""); final int lineNumber = stackTraceEl

我有一段代码,用于打印当前的java文件以用于日志记录

final StackTraceElement stackTraceElement = new Throwable().fillInStackTrace().getStackTrace()[2];
final String parentClassName = stackTraceElement.getFileName().replaceAll(".java", "");
final int lineNumber = stackTraceElement.getLineNumber();
我在groovy中写了一些东西,使用上面的代码打印日志,大多数情况下都是有效的,但是在运行了几次之后,我开始得到NPE

java.lang.NullPointerException
        at com.bla.general.util.log.LogUtils.generateLogMessage(LogUtils.java:140)
        at com.bla.general.util.log.LogUtils.info(LogUtils.java:67)
        at sun.reflect.GeneratedMethodAccessor831.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
        at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43)
        at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
        at com.bla.AppVersionServiceImpl.getAppVersion(AppVersionServiceImpl.groovy:47)
当以下行是发起人时:

LogUtils.info("Trying to get details for device hash ${deviceHash}");
我使用tomcat和Java1.7作为我的堆栈。重启Tomcat后,一切恢复正常。
这是我第一次尝试JVM的动态世界。如果您能启发我,我将不胜感激。

我正在深入研究,GString是否有可能被记忆化?GString没有被记忆化,但它被惰性地评估。您可以尝试使用
.toString()
(或者简单地使用单引号和加号)转换为字符串,并查看它是否有任何变化。stacktrace元素是否没有文件名?也许,我不确定--groovy是一种动态语言,因此听起来很合理。每当我看到一个NPE并且不明白为什么,我至少要确保每个调用都是空安全的。
LogUtils
代码看起来像纯java,这可能是一个难题。在groovy中,它通常与使用:
?。