java.lang.NullPointerException at java.io.FilterInputStream.close(FilterInputStream.java:172) at sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream.close(JarURLConnection.java:108) at com.alba.vware.ResourceServlet.doGet(ResourceServlet.java:396) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at com.alba.vware.ServletDefinition.doService(ServletDefinition.java:261) at com.alba.vware.ServletDefinition.service(ServletDefinition.java:175) at 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: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) [Continued on next page]
When a tail recursion is eliminated, there's no stack frame left to use to print a traceback when something goes wrong later.
— Guido van Rossum
[Continued from previous page] 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 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) [Continued on next page]
The elimination of stack frames doesn't do anything for the algorithmic complexity of the code, but it does make debugging harder.
— Guido van Rossum
[Continued from previous page] 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 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) [Continued on next page]
My issue with this optimization is that you lose debugging information.
— Ian Bicking
[Continued from previous page] 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 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) [Continued on next page]
Tail recursion can be easily inlined, however it is my understanding that the Java creators specifically chose not to implement this, as it makes resultant code hard to debug (if not impossible).
— Andrew Monkhouse
[Continued from previous page] 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 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) [Continued on next page]
This will confuse users who inadvertently wrote something recursive (the recursion isn't obvious in the stack trace printed), and makes debugging hard.
— Guido van Rossum
[Continued from previous page] 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 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) [Continued on next page]
I am a big fan of being able to get stack backtraces when I have a problem to debug. But tail call recursion silently throws away stack frames. You get great performance benefits from doing so, but I'd like an option when debugging to get at the information that has been thrown away.
— btilly
[Continued from previous page] 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 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) [Continued on next page]
I'm uninterested in optimizing tail recursion.
— Guido van Rossum
[Continued from previous page] 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.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118) at com.alba.vware.Filter.doFilter(Filter.java:113) at com.alba.vware.FilteredServlet$Chain.doFilter(FilteredServlet.java:176) at com.alba.vware.FilteredServlet.service(FilteredServlet.java:145) at com.alba.vware.HttpConnection.runServletFromWithinSpan(HttpConnection.java:933) at com.alba.vware.HttpConnection.access$000(HttpConnection.java:71) at com.alba.vware.HttpConnection$1.runServletFromWithinSpan(HttpConnection.java:854) at com.alba.vware.TraceHelper$TraceableServletRunnable$2.run(TraceHelper.java:467) at com.alba.vware.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.alba.vware.LocalTraceSpanBuilder.run(LocalTraceSpanBuilder.java:518) at com.alba.vware.TraceHelper$TraceableServletRunnable.beginNewTrace(TraceHelper.java:411) at com.alba.vware.TraceHelper$TraceableServletRunnable.runWithTracingEnabled(TraceHelper.java:377) at com.alba.vware.TraceHelper$TraceableServletRunnable.run(TraceHelper.java:339) at com.alba.vware.HttpConnection.runServlet(HttpConnection.java:850) at com.alba.vware.HttpConnection.run(HttpConnection.java:815) at com.alba.vware.DispatchQueue$WorkerThread.run(DispatchQueue.java:379)
The default value for thread stack size is 128K for 32-bit server and 256K for 64-bit server.
— Java manual