【问题标题】:java.lang.ArrayIndexOutOfBoundsException object arrayjava.lang.ArrayIndexOutOfBoundsException 对象数组
【发布时间】:2015-08-23 18:45:07
【问题描述】:

您好,我正在尝试创建一个程序,该程序从数据库中收集任务并显示它们以供编辑。有一个问题我不知道如何解决。

我想用数据库中的信息加载几个任务对象。该错误仅在程序实际运行时出现。

这是错误

Please enter a corresponding number: 2
This works? 1
5.6.25-log
This works? 2
This works? 3
This works? 4
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at mytaskapp.DatabaseConnectTaskSelect.Connect(DatabaseConnectTaskSelect.java:65)
at mytaskapp.Display.TaskOutput(Display.java:175)
at mytaskapp.Display.StartScreen(Display.java:51)
at mytaskapp.MyTaskApp.main(MyTaskApp.java:16)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

我的代码

public static void Connect()
{
    Connection con = null;
    Statement st = null;
    ResultSet rs = null;
    Statement stu = null;
    ResultSet rsu = null;
    PreparedStatement pst = null;

    String url = "jdbc:mysql://localhost:3306/tasks";
    String user = "root";
    String password = "cinder";        

    try {
        int index = 1;            
        TaskObject[] task = new TaskObject[index];
        System.out.println("This works? 1");
        con = DriverManager.getConnection(url, user, password);
        st = con.createStatement();
        rs = st.executeQuery("SELECT VERSION()");

        if (rs.next()) {
            System.out.println(rs.getString(1));
        }

        System.out.println("This works? 2");
        pst = con.prepareStatement("SELECT mainTaskString, timeCreated, dateCreated, timeDue, dateDue, "
                                 + "notes, project, catagory, taskLength, priority, remind1TimeDue, remind1DateDue, "
                                 + "remind2TimeDue, remind2DateDue FROM usertasks");

        rsu = pst.executeQuery();

        System.out.println("This works? 3");
        while (rsu.next()) {
            index = 1;
            //task[index] = new TaskObject(index);
            System.out.println("This works? 4");
            task[index].setTask(rsu.getString("mainTaskString"));
            System.out.println("This works? 4.1");
            task[index].setDateCreated(rsu.getString("timeCreated") + " " + rsu.getString("dateCreated"));
            System.out.println("This works? 4.2");
            task[index].setDateDue(rsu.getString("timeDue") + " " + rsu.getString("dateDue"));
            System.out.println("This works? 4.3");
            task[index].setNotes(rsu.getString("notes"));
            task[index].setProject(rsu.getString("project"));
            task[index].setCatagory(rsu.getString("catagory"));
            task[index].setTaskLength(rsu.getInt("taskLength"));
            task[index].setPriority(rsu.getInt("priority"));
            task[index].setRemind1DateDue(rsu.getString("remind1TimeDue") + " " + rsu.getString("remind1DateDue"));
            task[index].setRemind2DateDue(rsu.getString("remind2TimeDue") + " " + rsu.getString("remind2DateDue"));

            System.out.println("This works? 5");
            System.out.println("Your Task: " + task[index].getTask() + "\n" + " Date Created: " + task[index].getDateCreated() + " Date Due: " +  task[index].getDateDue() + 
                               " Your Notes: " +  task[index].getNotes() + "\n" + " Project: " + task[index].getProject() + " Catagory: " +  task[index].getCatagory() + " The minutes needed to complete: " +  task[index].getTaskLength() +
                               " Priority: " + task[index].getPriority() +  " Reminder 1: "  + 
                               task[index].getRemind1DateDue() +  " Reminder 2: "  +  task[index].getRemind2DateDue() + "\n");
            System.out.println("This works? 6");
            //index++;
        }

【问题讨论】:

  • *index = 1。顺便说一句,这不会导致问题。
  • index = ; 呢?
  • 确实——请提供一个简短但完整的程序来说明问题。目前您缺少一个关键部分(您分配给 index 的值),但您有很多不相关的 JDBC 代码。
  • 您正在创建大小为 1 的数组 TaskObject[] 任务。因此,当您的查询返回 1+ 条记录时,将引发 ArrayIndexOutOfBoundException。您需要增加数组大小或改为使用 ArrayList。
  • 请澄清您所说的“完成”是什么意思。我修复了索引部分。它给出了同样的错误。

标签: java sql arrays object exception


【解决方案1】:

您可以定义数组only once 的大小。因此,请确保您正确定义它,否则当您尝试输入的值超过指定的大小时,它会抛出 ArrayIndexOutOfBoundsException

在您的代码中,您将大小指定为1。因此,当您尝试在 task 数组中放入超过 1 个值时,您将收到此异常。

所以请确保您指定了足够的大小,例如 50。

但我建议使用List 而不是Array,因为它可以灵活地自动增加大小而无需指定大小。可以参考Array or List in Java


您可以在代码中进行以下更改

声明taskList而不是任务数组。

List<TaskObject> taskList = new ArrayList<TaskObject>();

while循环create object的TaskObject,set values进入它,然后add它进入taskList。

TaskObject taskObject = null;
while (rsu.next()) {
    taskObject = new TaskObject();

    taskObject.setTask(rsu.getString("mainTaskString"));
    //set remaining value

    //Add taskObject in List
    taskList.add(taskObject);
}

【讨论】:

    【解决方案2】:
        int index = 1;            
        TaskObject[] task = new TaskObject[index];
    

    这将创建大小为 1 的 TaskObject 类型对象的数组。这意味着 它只能有 task[0]。如果你给 task[1] 它是数组超出范围

    所以在while循环中应该是(根据你的经验)

      index = 0;
            System.out.println("This works? 4");
            task[index].setTask(rsu.getString("mainTaskString"));
    

    如果您的查询返回固定数量的行,那么建议使用数组,否则使用数组列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      相关资源
      最近更新 更多