【问题标题】:Index 3 out of bounds for length 3 [duplicate]索引 3 超出长度 3 [重复]
【发布时间】:2019-10-30 07:27:51
【问题描述】:

我正在尝试将 csv 文件中的数据读入我创建的数据库中的表中。到目前为止,我已经完成了 3 个表,所以第四个表的代码应该相对相同,但我一直收到错误

线程“main”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 3 超出长度 3 的范围 在 Verbindung.main(Verbindung.java:136)

这应该是一个很容易解决的问题,但我看不出哪里出错了,因为我的数组中的变量索引和数量似乎匹配得很好。

这是我的代码

  // Parsing CSV file Facebookapp 
           try {
                Scanner inputStream3 = new Scanner(file3);
                //inputStream.useDelimiter("[;/n]");
                while(inputStream3.hasNext()) {
                    String data3 = inputStream3.next();
                    System.out.println(data3);
                    String[] values3 = data3.split(";");    
                    System.out.println(data3);
                    //if(values.toString().contains(";;;")) break;
                    int PRODNUM = Integer.parseInt(values3[0]);
                    double V_ERSION = Double.parseDouble(values3[1]);
                    String PHONE_ASSOC = values3[2];
                    int accountNUM = Integer.parseInt(values3[3]);
                    //creating the object FBapp with the relevant parameters
                    FBapp fbapp = new FBapp(PRODNUM, V_ERSION, PHONE_ASSOC, accountNUM);
                    facebookapp.add(fbapp);
                    }
                inputStream3.close();
                }
                catch(FileNotFoundException d) {
                d.printStackTrace();
            }

    try {
        // establish connection to database
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String database = "jdbc:oracle:thin:@oracle-lab.cs.univie.ac.at:1521:lab";
        String user = "a01547605";
        String pass = "dbs19";
        Connection con = DriverManager.getConnection(database, user, pass);
        Statement stmt = con.createStatement();
        String sql3 = "INSERT into facebookapp(PRODNUM, V_ERSION, PHONE_ASSOC, accountNUM) values(?,?,?,?)";
        PreparedStatement ps = con.prepareStatement(sql3);

        final int batchSize = 100;
        int count = 0;
        for(FBapp d: facebookapp) {
            ps.setInt(1, d.getPRODNUM());
            ps.setDouble(2, d.getV_ERSION());
            ps.setString(3, d.getPHONE_ASSOC());
            ps.setInt(4, d.getaccountNUM());
            ps.addBatch();

            if(++ count% batchSize == 0) {
                ps.executeBatch();
            }
        }
          ps.close();

      }   

          catch (Exception e) {
          System.err.println(e.getMessage());
          }

我的 CSV 文件如下所示,这是 100 的第一行

1   1.00    Iphone  100

当我在 CSV 文件被删除之前打印出正在读取的内容时,这就是它的样子

1;1.00;Iphone

【问题讨论】:

  • 您显示的最后一行(“1;1.00;Iphone”)只有 3 个值(“1”、“1.00”、“Iphone”),但您正在尝试读取第 4 个值此行不存在!
  • 它在CSV文件中,有第四行“accountNUM”我在我的代码中也明确定义了这个,我不明白为什么它没有在第四列中读取。我试图查看 csv 文件中是否有需要更正的地方,但一切看起来都很好
  • 嗯,您显示的第一行(“1 1.00 Iphone 100”)有四列,最后一行(“1;1.00;Iphone”)只有三列。您的 CSV 中的某行似乎缺少一列。
  • 我在记事本中打开它只是为了看看它在那里的样子,这里是 1;1.00;Iphone ;100 看起来完全正常......
  • 问题已解决,Iphone 和 ; 后面的空格不喜欢;

标签: java sql eclipse oracle csv


【解决方案1】:

System.out.println(data3); 是打印“1;1.00;Iphone”的内容,它应该是 CSV 文件的内容。这一行只有三个值,因此由于您对程序进行了硬编码以期望在int accountNUM = Integer.parseInt(values3[3]); 处有第四个值,因此它将在此处失败。

您还打印了两次 data3。尝试在第二个语句中打印出数组 values3 的内容以捕获代码错误。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2021-04-09
    • 1970-01-01
    • 2020-12-05
    • 2021-05-29
    • 1970-01-01
    • 2016-02-14
    • 2021-02-03
    • 2023-04-11
    相关资源
    最近更新 更多