前幾天實訓的時候,做了一個視頻分享網站,在測試的過程中,突然發現了一個問題,調試了大概3個小時才搞定,於是乎,寫一篇部落格來紀念因為自己手賤造成的一個錯誤。
錯誤描述:
java.sql.SQLException: No value specified for parameter 16at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1993)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)at com.sxu.common.ConnDatabaseUtil.Execute(ConnDatabaseUtil.java:46)at com.sxu.dao.ResourceDaoImpl.AddRecord(ResourceDaoImpl.java:37)at com.sxu.service.ResourceServiceImpl.upload(ResourceServiceImpl.java:23)at com.sxu.action.ResourceAction.Add(ResourceAction.java:59)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 com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)
使用java編程的都知道,這玩意發生錯誤時往往會給出一大片,可其實有用的也就那麼幾條。當然,這個也一樣,就是下面幾條錯誤:
java.sql.SQLException: No value specified for parameter 16at com.sxu.common.ConnDatabaseUtil.Execute(ConnDatabaseUtil.java:46)at com.sxu.dao.UserDaoImpl.AddRecord(UserDaoImpl.java:37)at com.sxu.service.UserServiceImpl.register(UserServiceImpl.java:23)
可實際想一下,寫的串連資料庫的工具類肯定不會錯,因為其他模組都沒有問題,而action層調用了service層, 而service也僅僅是簡單地調用了Dao層,所以最後就定位到了Dao層:
public void AddRecord(ResourceBean resource) throws ClassNotFoundException,SQLException {// TODO Auto-generated method stubString sql = "insert into t_resource(title, icon_url, file_name, resource_url, type, user_id, upload_time, " + "size, label, scan_count, download_count, play_count, state, manager_id, remark)" + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";Object[] params = {resource.getTitle(),resource.getIcon_url(),resource.getFile_name(),resource.getResource_url(),resource.getType(),resource.getUser_id(),resource.getUpload_time(),resource.getSize(),resource.getLabel(),resource.getScan_count(),resource.getDownload_count(),resource.getPlay_count(),resource.getState(),resource.getManager_id(),resource.getRemark()};ConnDatabaseUtil.Execute(sql, params);}
可是看了半天都沒有發現有什麼錯誤,單步進去,跳著跳著就不見了,很是納悶,看參數的設定也沒有問題,就這樣一直搞了幾個小時,最後我就看sql
語句中的第16個參數,才發現,原來sql語句中的多了一個?,也就是多寫了一個參數,我勒個去,這才恍然大悟,原來是中午修改了資料庫,忘了修改這裡了,
對於這裡的錯誤,eclipse又不提示,就這樣花費了3個小時,還好,最後終於解決了。
所以寫一篇博文,來紀念一下自己的疏忽大意,以此為訓!同時也希望能夠協助出現同樣錯誤的同道!