我在执行 Web 应用程序时收到 "Index 6 out of bounds for length 6"

I am getting "Index 6 out of bounds for length 6" while executing my web application

我正在尝试编写一个 servlet,它从表单中获取值并将其存储在名为 material 的 table 中。页面如下: This is my page.The number of entries can be anything between 1 to 6.

对于我的测试 运行,我只有一个条目,点击提交后出现错误 "index 6 out of bounds for length 6"。注意:单个条目意味着我只填写了 6.

中的一个 material 的详细信息

这就是我的 servlet 代码的样子。我已经使用 request.getParameterValues 在数组中输入表单数据。

Class.forName(driver);

        Connection connection = DriverManager.getConnection(connectionUrl + database, userid, password);
        connection.setAutoCommit(false);
        String insertTableSQL = "INSERT INTO material" + " (PassNumber, InitiatingOfficer, staff_id, Materials, Quantity, Unit, Date_of_return) VALUES " + " (?, ?, ?, ?, ?, ?, ?);";
        PreparedStatement st = connection.prepareStatement(insertTableSQL);
        for(int i=0; i<Materials.length; i++){
           st.setString(1, PassNumber);
           st.setString(2, InitiatingOfficer);
           st.setInt(3, staff_id);
           st.setString(4, Materials[i]);
           st.setString(5, Quantity[i]);
           st.setString(6, Unit[i]);
           st.setString(7, Date[i]);
           st.addBatch();
        }
        st.executeBatch();

这是我初始化数组的方式:

public class raisegatepass extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    LoginBean loginBean = new LoginBean();
    String PassNumber = generatePIN();  //Pass Number
    String InitiatingOfficer = loginBean.getName();  // Name
    int staff_id = loginBean.getstaffid();    // Staff ID
     String[] Materials = request.getParameterValues("materialInfo"); // Array containing Material Name list
     String[] Unit = request.getParameterValues("materialUnit"); // Array containing Unit
     String[] Quantity = request.getParameterValues("materialQuantity");  // Array containing Quantity in string
      String[] Date = request.getParameterValues("materialDate"); // date of return

另外,每当我事先不知道用户将填写多少行时,这是将数据输入我的 table 的正确方法吗?

编辑:这是我的 servlet 的完整代码

public class raisegatepass 扩展了 HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    LoginBean loginBean = new LoginBean();
    String PassNumber = generatePIN();  //Pass Number
    String InitiatingOfficer = loginBean.getName();  // Name
    int staff_id = loginBean.getstaffid();    // Staff ID
     String[] Materials = request.getParameterValues("materialInfo"); // Array containing Material Name list
     String[] Unit = request.getParameterValues("materialUnit"); // Array containing Unit
     String[] Quantity = request.getParameterValues("materialQuantity");  // Array containing Quantity in string
      String[] Date = request.getParameterValues("materialDate"); // date of return

      String driver = "com.mysql.jdbc.Driver";
      String connectionUrl = //Url
      String database = //Database
      String userid = //userid
      String password = //password

      try {
        Class.forName(driver);

        Connection connection = DriverManager.getConnection(connectionUrl + database, userid, password);
        connection.setAutoCommit(false);
        String insertTableSQL = "INSERT INTO material" + " (PassNumber, InitiatingOfficer, staff_id, Materials, Quantity, Unit, Date_of_return) VALUES " + " (?, ?, ?, ?, ?, ?, ?);";
        PreparedStatement st = connection.prepareStatement(insertTableSQL);
        for(int i=0; i<Materials.length; i++){
           st.setString(1, PassNumber);
           st.setString(2, InitiatingOfficer);
           st.setInt(3, staff_id);
           st.setString(4, Materials[i]);
           st.setString(5, Quantity[i]);
           st.setString(6, Unit[i]);
           st.setString(7, Date[i]);
           st.addBatch();
        }
        st.executeBatch();

    } catch(Exception e)
    {
          JOptionPane.showMessageDialog(null, e.getMessage());
          RequestDispatcher view = request.getRequestDispatcher("gatepass_raise.jsp");
      view.forward(request, response);
    }     

      public String generatePIN() 
{   
   int x = (int)(Math.random() * 6);
   x = x + 1;
   Random r = new Random();
   char c = (char)(r.nextInt(26) + 'A');
   String randomPIN = c + (x + "") + ( ((int)(Math.random()*100)) + "" );
  return randomPIN;
}   

}

如果所有数组的长度都相同,这段代码应该没问题,但我的猜测是不一样(只是猜测,因为没有提供异常堆栈)。您在视图中有什么 (jsp)?材料的元素可能多于单位、数量、日期?

要检查长度,您可以在 servlet 中添加一些调试输出,例如:

String[] Date = request.getParameterValues("materialDate"); // date of return
...
System.out.println("Materials length: " + Materials.length));
System.out.println("Unit length: " + Unit.length));
System.out.println("Quantity length: " + Quantity.length));
System.out.println("Date length: " + Date.length));