2

이전 코드에서 제목과 동일한 오류가 발생했습니다. 열 위치 '0'이 범위를 벗어났습니다. 이 ResultSet에 대한 열의 수는 '3'

나는 내 코드에서 사용자 이름 유효성 검사기를했지만, 다음 코드를 포함하는 것을 잊었다 : 나는이 문제를 해결할 것을 추가 한 후

password =ESAPI.validator().getValidInput("Login password", password, "Password", 20, false); 

합니다.

내 다음 java 페이지에서 동일한 문제가 발생하여 코드를 검토 한 결과 누락 된 부분을 찾을 수 없었습니다. 실제로 누락 된 부분이있는 경우입니다.

다른 코드 줄을 포함하는 것을 잊어 버렸기 때문에 내가 작업하고 있던 다른 코드와 동일한 오류가 발생하여 해결할 수있었습니다.

그러나이 코드 조각에 대해서는 여러 번 지나쳤으며 그 중 무엇이 잘못되었는지 알 수 없습니다.

package com.tunestore.action; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.Statement; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.sql.DataSource; 

import org.apache.struts.action.Action; 
import org.apache.struts.action.ActionForm; 
import org.apache.struts.action.ActionForward; 
import org.apache.struts.action.ActionMapping; 
import org.apache.struts.action.ActionMessage; 
import org.apache.struts.action.ActionMessages; 
import org.apache.struts.action.DynaActionForm; 
import org.apache.struts.util.MessageResources; 
import org.owasp.esapi.ESAPI; 

import com.tunestore.util.IWithDataSource; 

public class RegisterAction extends Action implements IWithDataSource { 
    private DataSource dataSource; 

    public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
    } 

    public ActionForward execute(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) 
     throws Exception { 
    DynaActionForm daf = (DynaActionForm)form; 
    ActionMessages errors = new ActionMessages(); 
    ActionForward forward = mapping.getInputForward(); 
    MessageResources resources = getResources(request); 


    //ESAPI START 
    if (!ESAPI.validator().isValidInput("Register username", daf.getString("username"), "SafeString", 20, false)) { 
    //ESAPI END 


     errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.required", resources.getMessage("prompt.username"))); 
    } 


    //ESAPI START 
    if (!ESAPI.validator().isValidInput("Register password", daf.getString("password"), "password", 20, false)) { 
    //ESAPI END 


     errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.required", resources.getMessage("prompt.password"))); 
    } 


    //ESAPI START 
    if (!ESAPI.validator().isValidInput("Register confirm password", daf.getString("rptpass"), "password", 20, false)) { 
    //ESAPI END 


     errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("errors.required", resources.getMessage("prompt.rpt"))); 
    } 
    if ((null != daf.getString("password")) && (null != daf.getString("rptpass"))) { 
     if (! daf.getString("password").equals(daf.getString("rptpass"))) { 
     errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.rptpass.nomatch")); 
     } 
    } 

    Connection conn = null; 
    try { 
     conn = dataSource.getConnection(); 
     Statement stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery("SELECT COUNT(*) USERCNT " 
      + "FROM TUNEUSER " 
      + "WHERE USERNAME = '" 
      + daf.getString("username") 
      + "'"); 
     rs.next(); 
     if (rs.getInt("USERCNT") > 0) { 
     errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.user.exists")); 
     } else if (errors.isEmpty()) { 



      //ESAPI START 
      String sql = "INSERT INTO TUNEUSER (USERNAME,PASSWORD,BALANCE) VALUES (?, ?, ?)"; 
      PreparedStatement pStmt = conn.prepareStatement(sql); 
      pStmt.setString(0, daf.getString("username")); 
      pStmt.setString(1, daf.getString("password")); 
      pStmt.setDouble(2, 0.00); 
      pStmt.executeUpdate(); 
      //ESAPI END 



     ActionMessages msgs = getMessages(request); 
     msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("user.added")); 
     forward = mapping.findForward("success"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw e; 
    } finally { 
     if (conn != null) { 
     try { conn.close(); } catch (Exception e) {} 
     } 
    } 

    request.setAttribute("ERRORS.REGISTER", errors); 
    return forward; 
    } 
} 

코드가 등록 양식이다 : 여기

코드이다. 다음 오류가 대가로 주어 지지만 등록을 시도 할 때. 코드의

pStmt.setString(0, daf.getString("username")); 

그러나이 선이 나에게 올바른 같습니다

java.sql.SQLException: The column position '0' is out of range. The number of columns for this ResultSet is '3'. 
    at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 
    at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.setString(Unknown Source) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:132) 
    at com.tunestore.action.RegisterAction.execute(RegisterAction.java:90) 
    at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110) 
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) 
    at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) 
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) 
    at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) 
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.tunestore.servlet.PersistenceFilter.doFilter(PersistenceFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244) 
    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:161) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: org.apache.derby.client.am.SqlException: The column position '0' is out of range. The number of columns for this ResultSet is '3'. 
    at org.apache.derby.client.am.ColumnMetaData.checkForValidColumnIndex(Unknown Source) 
    ... 34 more 



ROOT CAUSE 
org.apache.derby.client.am.SqlException: The column position '0' is out of range. The number of columns for this ResultSet is '3'. 
    at org.apache.derby.client.am.ColumnMetaData.checkForValidColumnIndex(Unknown Source) 
    at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown Source) 
    at org.apache.derby.client.am.PreparedStatement.setString(Unknown Source) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:132) 
    at com.tunestore.action.RegisterAction.execute(RegisterAction.java:90) 
    at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110) 
    at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) 
    at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) 
    at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) 
    at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) 
    at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) 
    at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) 
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.tunestore.servlet.PersistenceFilter.doFilter(PersistenceFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244) 
    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:161) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

오류는 내 코드의 90 라인을 가리키는 것으로 보인다. 나는 무엇을 놓칠 수 있 었는가?

+0

올바른 코드를 표시하도록 업데이트되었습니다. 원래 잘못된 코드를 붙여 넣었습니다. – Turk

답변

6

열 인덱스는 JDBC

난 당신이 코드에서 setString를 호출 볼 수없는 1에서 시작하지만 스택 추적 명확하게 execute 라인 번호 90에서 setString 촉구했다. 게시 한 코드가이 예외가 발생할 때 실행중인 코드입니까?

+0

업데이트 됨. 저의 관심을 가져 주셔서 감사합니다. – Turk

+0

내 문제를 해결하는 데 도움이 될 수 있다고 생각합니다. 나는 두 개의 다른 자바 파일과 다른 몇 가지 비틀기에서 1로 시작하도록 카운트를 변경해야했습니다. 그것은 내가 그 오류를 지나쳐 버렸고, 다음 오류로 넘어 갔다. 도와 줘서 고마워! – Turk