Background: Servlet version 3.1(3.0以後就有了@WebServlet註解)java
Errorweb
嚴重: Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"] java.lang.NullPointerException at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316) at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492) at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821) at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551) at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.core.StandardService.destroyInternal(StandardService.java:589) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.startup.Catalina.start(Catalina.java:633) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485) 十月 27, 2016 11:36:07 下午 org.apache.coyote.AbstractProtocol destroy 信息: Destroying ProtocolHandler ["ajp-nio-8009"] 十月 27, 2016 11:36:07 下午 org.apache.coyote.AbstractProtocol destroy 嚴重: Failed to destroy end point associated with ProtocolHandler ["ajp-nio-8009"] java.lang.NullPointerException at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316) at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492) at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821) at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551) at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.core.StandardService.destroyInternal(StandardService.java:589) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877) at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292) at org.apache.catalina.startup.Catalina.start(Catalina.java:633) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
我首先分析了是否是端口號被佔用了的問題,使用netstat -ano|findstr "8080"
未找到有使用該端口的進程。因而我回頭瀏覽代碼,並將web.xml中的servlet配置刪除掉,tomcat正常啓動,難道是下面的servlet配置錯了?apache
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.study.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
這個配置沒有問題,接下來就去看servlet的實現了,發現這個類有個註解,查看了一下這個註解的含義tomcat
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { ... }
這裏將@WebServlet("/loginServlet")註解去掉,tomcat就能啓動成功,因而問題就來了,爲何註釋掉這段註解就OK了?
咱們先看看這段註解是幹什麼的:
~~
在Servlet3.0以後,能夠使用註解來告知Servlet容器哪些Servlet會提供服務,使用@WebServlet("/loginServlet")註解表示了當url的請求爲loginServlet,則由LoginServlet實例提供服務。因此當你添加了註解,又在web.xml中進行了servlet的配置,我猜測會形成衝突,servlet會初始化2次,那麼咱們刪掉註解或者刪掉web.xml中的配置都能正常啓動tomcat。
~~app
以上是我面對這個Error找出的解決方案,不必定適合你的Error,僅供參考。url