DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10909>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10909

Problem calling anonymous classes in servlet destroy() method

           Summary: Problem calling anonymous classes in servlet destroy()
                    method
           Product: Tomcat 4
           Version: 4.0.4 Final
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Catalina
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


Symptoms: Servlet destroy() method fails with a java.lang.NoClassDefFoundError
when an anonymous local class is used.  A similar anonymous local class can be
used e.g. in the servlet doGet() method without error.

Example code producing the error:

package tests;

import javax.servlet.*;
import javax.servlet.http.*;

public class TestServlet extends HttpServlet {
   
   protected String[] strings = {
         "delta",  "charlie", "echo", 
         "foxtrot", "alpha", "bravo"
   };
   
   public void init() {
   }
   
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, java.io.IOException {

      java.util.ArrayList myList = new java.util.ArrayList();
      for(int i = 0; i < strings.length; ++i) {
         myList.add(strings[i]);
      }

      response.setContentType("text/plain");
      java.io.PrintWriter out = response.getWriter();
      out.println(new java.util.Date());
      out.println("Unsorted list:");
      for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) {
         out.println(it.next());
      }
      out.println("Reverse sorted using comparator inner class:");
      java.util.Collections.sort(myList, new java.util.Comparator() {
         public int compare(java.lang.Object o1, java.lang.Object o2) {
            String s1 = (String) o1;
            String s2 = (String) o2;
            return s2.compareTo(s1);
         }
      });
      for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) {
         out.println(it.next());
      }
      out.close();
   }
   
   public void destroy() {

      java.util.ArrayList myList = new java.util.ArrayList();
      for(int i = 0; i < strings.length; ++i) {
         myList.add(strings[i]);
      }

      try {
         System.out.println("Reverse sorted list:");
         for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) {
            System.out.println(it.next());
         }
         System.out.println("Sorted using comparator inner class:");
         java.util.Collections.sort(myList, new java.util.Comparator() {
            public int compare(java.lang.Object o1, java.lang.Object o2) {
               String s1 = (String) o1;
               String s2 = (String) o2;
               return s1.compareTo(s2);
            }
         });
         for(java.util.Iterator it = myList.iterator(); it.hasNext(); ) {
            System.out.println(it.next());
         }
      }
      catch(Throwable th) {
         log("caught in destroy(): ", th);
      }
      super.destroy();
   }
   
}

The code in the doGet() method works fine (i.e. the list is sorted in reverse
alphabetical order as expected).  However, when Tomcat is stopped in the normal
way, the essentially identical code in the destroy() method throws an exception
like:

2002-07-17 18:12:14 TestServlet: caught in destroy(): 
java.lang.NoClassDefFoundError: tests/TestServlet$2
        at tests.TestServlet.destroy(TestServlet.java:58)
        at org.apache.catalina.core.StandardWrapper.unload(StandardWrapper.java:1090)
        at org.apache.catalina.core.StandardWrapper.stop(StandardWrapper.java:1298)
        at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:984)
        at org.apache.catalina.startup.ContextConfig.stop(ContextConfig.java:877)
        at 
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:226)
        at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:155)
        at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1151)
        at org.apache.catalina.core.StandardContext.stop(StandardContext.java:3495)
        at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:984)
        at org.apache.catalina.core.StandardHost.remove(StandardHost.java:815)
        at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:422)
        at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:402)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:234)
        at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:155)
        at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1151)
        at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1163)
        at org.apache.catalina.core.StandardService.stop(StandardService.java:435)
        at org.apache.catalina.core.StandardServer.stop(StandardServer.java:535)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:799)
        at org.apache.catalina.startup.Catalina.execute(Catalina.java:681)
        at org.apache.catalina.startup.Catalina.process(Catalina.java:179)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:324)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:243)

The TestServlet$2.class (and the TestServlet$1.class) anonymous class
implementation files are both present in the WEB-INF/classes/tests subdirectory.

The problem seems to only occur in the destroy() method.

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to