尾部递归和调试(2011)

2020-09-22 00:25:30

Java.io.FilterInputStream.close(FilterInputStream.java:172)的java.lang.NullPointerException在sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream.close(JarURLConnection.java:108)的com.alba.vware.ResourceServlet.doGet(ResourceServlet.java:396)的javax.servlet.http.HttpServlet.service(HttpServlet.java:617)的javax.servlet.http.HttpServlet.service(HttpServlet.java:717)的com.alba.vware.ServletDefinition.doService(ServletDefinition.java:261)的com.alba.vware.ServletDefinition.service(。ServletDefinition.java:175at com.alba.vware.ManagedServletPipeline.service(ManagedServletPipeline.java:91)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:62)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition。.java:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)[下一页续]。

当尾部递归被消除时,没有堆栈框架留下来,以便在以后出错时打印回溯。

[上一页续]在com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke。.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.。JAVA:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java。:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)[下一页续]。

消除堆栈帧并不会增加代码的算法复杂性,但会使调试变得更加困难。

[上一页续]在com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition。.java:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.。JAVA:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at c

这会让那些无意中编写了递归代码(在打印的堆栈跟踪中不明显)的用户感到困惑,并使调试变得困难。

[上一页续]在com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke。.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.。JAVA:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java。:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)[下一页续]。

当我有问题要调试时,我非常喜欢能够获得堆栈回溯。但是尾部调用递归会悄悄地丢弃堆栈帧。这样做会给您带来很大的性能好处,但我希望在调试时有一个选项来获取已丢弃的信息。

[上一页续]在com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition。.java:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.。JAVA:58)在com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java。:167at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)[下一页续]。

[上一页续]在com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke。.java:58)at com.alba.vware.FilterDefinition.doFilter(FilterDefinition.java:167)at com.alba.vware.FilterChainInvoke.doFilter(FilterChainInvoke.java:58)at com.alba.vware.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)at com.alba.vware.Filter.doFilter(Filter.java:113)at com.alba.vware.FilteredServlet$Chain.doFilter(Filter