【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 2 [duplicate]java.lang.ArrayIndexOutOfBoundsException:2 [重复]
【发布时间】:2012-09-25 03:45:24
【问题描述】:

我正在尝试将 java 连接到 sql。虽然我是 javam 的新手,但我似乎无法找出原因。

java.lang.ArrayIndexOutOfBoundsException: 2 

你能帮我解答一下吗?

try{
       Connection con = dbConnection();

       String lname = this.last.getText();
       String fname = this.first.getText();
       String mname = this.mid.getText();
       String ad = this.add.getText();
       String bd = this.bday.getText();
       String ag = this.edad.getText();
       String nom = this.no.getText();
       String per = this.person.getText();

       String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?)"; //to insert to database

       PreparedStatement pre;

       pre = con.prepareStatement(query);


       pre.setString(1, lname);
       pre.setString(2, fname);
       pre.setString(3, mname);
       pre.setString(4, ad);
       pre.setString(5, bd);
       pre.setString(6, ag);
       pre.setString(7, nom);
       pre.setString(8, per);


       pre.execute();//execute

       con.close();


    }catch (Exception e){

        System.out.println(e);

    }

}

【问题讨论】:

  • 表名是否为“个人分类”,中间有空格?
  • 使用调试器单步调试代码。然后你会看到它失败的那一行。

标签: java


【解决方案1】:

您不能设置比“?”更多的准备好的语句属性。在您的查询中。

"ArrayIndexOutOfBoundsException: 2" 表示它在第三个 setString 处失败(内部数组与所有 java 数组一样从零开始),这是正常的,因为您只有两个 '?'在查询中。

编辑:

由于表名中的空格,您可能遇到了错误。试试

INSERT INTO [Personal Category]    (Lastname, ...

【讨论】:

  • 我已经更改了 VALUES(?,?,?,?,?,?,?,?)... 虽然它现在说“java.sql.SQLException: [Microsoft] [ODBC Microsoft Access 驱动程序] INSERT INTO 语句中的语法错误。”仍然感谢您的回复=)
  • 查看其他问题的编辑。我认为你可以用 [] 转义带有空格的表的名称(如果你真的需要一些......)。
  • 请注意,我不习惯访问。您可能必须使用'Personal Category'"Personal Category"
【解决方案2】:

您的VALUES() 声明中只有两个?。您需要拥有与列名一样多的名称。

试试

String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?,?,?,?,?,?,?)"; //to insert to database

【讨论】:

    【解决方案3】:

    你需要更多的问号 - 准确地说是六个。

    String query = "INSERT INTO Personal Category    (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?,?,?,?,?,?,?)";
    

    JDBC 将每个问号解释为参数的占位符,即您的程序承诺在准备语句后提供值。当您在准备好的语句上调用setStringsetIntsetLong 等时,必须存在相应的编号占位符。否则,java.lang.ArrayIndexOutOfBoundsException 被抛出。

    【讨论】:

      【解决方案4】:

      您的占位符 (?) 应该与传递给该 INSERT 语句的参数数量一样多。

      String query = "INSERT INTO PersonalCategory (Lastname, Firstname, Middle, " + 
      "Address, Birthday, Age, No, Person) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
      

      【讨论】:

      • 我已经更改了 VALUES(?,?,?,?,?,?,?,?)... 虽然它现在说“java.sql.SQLException: [Microsoft] [ODBC Microsoft Access 驱动程序] INSERT INTO 语句中的语法错误。”仍然感谢您的回复 =)
      【解决方案5】:

      String query = "INSERT INTO Personal Category (Lastname,Firstname,Middle,Address,Birthday,Age,No,Person) VALUES (?,?)";

      问题在于要在 VALUES 中传递的参数数量,您只传递了 2 个参数需要 8 个。

      【讨论】:

      • 我已经更改了 VALUES(?,?,?,?,?,?,?,?)... 虽然它现在说“java.sql.SQLException: [Microsoft] [ODBC Microsoft Access 驱动程序] INSERT INTO 语句中的语法错误。”仍然感谢您的回复=)
      • 您的表名可能有问题。之间有空格。表名称的单词之间不能有空格。检查它,你需要删除它。
      【解决方案6】:

      你已经得到了“ArrayIndexOutOfBound”问题的答案。我将回答您的第二个问题“SQLException”并提供一些建议以改进您的代码。

      那个 SQLException 正在发生,因为我猜是你的表名。您的表名中有 2 个单词,这可能会使编译器感到困惑。

      建议

      1. 您正在执行preparedStatement,但未捕获其输出值。它会给你一个布尔值作为输出。那么只有你才能找到执行了什么样的事情。

      2. 在这里,您似乎只是在插入数据,而且您确定自己只是在插入数据。因此,如果是,请使用 executeUpdate() 而不是 execute() 方法。

      3. 始终关闭 final() 块内的连接。这样,无论代码是否失败,您都可以始终确保连接已关闭。通过这样做,数据库高峰将得到顺利管理,不会保持不必要的连接打开。

      让我们保持良好的软件工程概念:)

      【讨论】:

        猜你喜欢
        • 2018-09-21
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多