1. 程式人生 > >java.lang.NullPointerException錯誤原因及解決思路

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的引用,一般這種型別的錯誤是這樣的

所以肯定會報錯。

理解了原因,接下來解決錯誤就好解決了。。。