java.lang.NullPointerException錯誤原因及解決思路
本機環境是在myeclipse2017報錯
錯誤資訊可能是這樣,很多時候碰到這樣錯誤,不知道該怎麼入手,下面是報空指向異常的其中一種情況
十一月 27, 2018 11:13:08 上午 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet [jsp] in context with path [/testjdbc] threw exception [An exception occurred processing JSP page /home.jsp at line 37
34: <td>錼嶄綔2</td>
35: </tr>
36: <%
37: for(int i=0;i<user.length;i++){
38: %>
39: <tr>
40: <td><%=user[i].getUsername()%></td>
Stacktrace:] with root cause
java.lang.NullPointerException
at org.apache.jsp.home_jsp._jspService(home_jsp.java:155)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1437)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
主要的錯誤資訊是:java.lang.NullPointerException
一般來說出現的錯誤都能從錯誤資訊找到哪裡錯了:
從這句話能看出,錯誤的型別是空指向異常.
這裡提示了,在home.jsp頁面的37行錯了(不要看到那裡亂碼了就以為是編碼問題,要注意它的報錯型別),其實這種在jsp頁面的空指標比較好找,因為已經告訴你在哪裡有可能會錯了,接下來就取那裡看一下
這是我的程式碼,37行可能錯的是不是就是user》length這個位置啊,user就是上面23行那裡從request域的userList裡面取出來的,物件陣列。
報錯的原因:
user為null,你用了一個null的東西去使用length,可以嘗試像上面那個圖24行加一個判斷是否為null。
有可能是你一執行專案就報錯(可能這個頁面是首頁),或者點某個功能的時候報錯,其實就是也是一個意思,user為空了。
就算註釋掉37行,40-46行也會報錯,因為在使用一個null的引用,可以不斷地往上一步看看值到底是在哪裡消失。
這裡就不給解決的過程,因為每個人程式碼不一樣,過程沒什麼太大用,主要是要理解出錯的原因。
用一個程式模擬出錯的原因:
從這段程式碼可以看到,user是==null,所以那個輸出語句等於System.out.println("user物件的值為:" + null.getName());
使用一個null的引用,一般這種型別的錯誤是這樣的
所以肯定會報錯。
理解了原因,接下來解決錯誤就好解決了。。。