Java中的线程“main”java.lang.IndexOutOfBoundsException中的异常

时间:2017-01-09 11:44:37

标签: java excel web-scraping

我知道这是一个已被多次询问过的错误,但我无法找到问题所在。错误显示如下:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 393, Size: 393
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at scraping.complementos_juegos.main(complementos_juegos.java:305)

我有很多不明白的事情。第一行显示Index: 393, Size: 393,这意味着什么?数组的索引和大小?

我们来看看代码:

1.-我废弃超过2.700个链接,这些链接保存在名为all_links的数组中。由于我想存储大量信息,因此我使用名为listaEmpresaA的双维ArrayList:

ArrayList<ArrayList<String>> listaEmpresaA = new ArrayList<ArrayList<String>>();

    String [] paises = {"USA"};

    int total_columnas = 2 + (paises.length*3);

    //CREATING THE COLUMS
     for(int i =0; i< total_columnas; i++){
                listaEmpresaA.add(new ArrayList<String>());
            }

     //DEFINITION OF THE ROWS


     //<--------------- START OF THE HEADER DEFINITION

     listaEmpresaA.get(0).add("Juego");
     listaEmpresaA.get(1).add("URL");



     for (z=0 ; z<paises.length; z++) {
         for (int j=2; j<total_columnas ; j=j+3 ) {
             listaEmpresaA.get(j).add(paises[z]);
             listaEmpresaA.get(j+1).add(paises[z] + " Gold");
             listaEmpresaA.get(j+2).add(paises[z] + " sin Gold");
         }
     }

    int filas = 1; //JUST TO KNOW THE AMOUNT OF ROWS I HAVE

     //<--------------- FINISH OF THE HEADER DEFINITION


    //<--------------- STARTING OF THE SCRAPING FOR EACH LINK

    int contador_juegos = 1;

    for (String link : all_links) {

     String urlPage = "https://www.microsoft.com" + link;
     System.out.println(contador_juegos + ".- Comprobando entradas de: "+urlPage);

     if (getStatusConnectionCode(urlPage) == 200) {

         Document document = getHtmlDocument(urlPage);

         Elements entradas = document.select("div.page-header div.m-product-detail-hero-product-placement div.context-product-placement-data");

         for (Element elem : entradas) {
             String titulo = elem.getElementsByClass("c-heading-2").text();

             System.out.println(titulo+"\n");
             listaEmpresaA.get(0).add(titulo);
             listaEmpresaA.get(1).add(urlPage);

         }

         entradas = document.select("div.price-info");

         for (Element elem : entradas) {
             String titulo = elem.getElementsByTag("s").text();

             System.out.println("Precio base: " + titulo+"\n");
             listaEmpresaA.get(2).add(titulo);

         }

         entradas = document.select("div.price-info");

         for (Element elem : entradas) {
             String titulo = elem.getElementsByClass("price-disclaimer").text();

             System.out.println("Precio para los miembros sin GOLD: " + titulo+"\n");
             listaEmpresaA.get(3).add(titulo);


         }

         entradas = document.select("dd.cli_upsell-options div.cli_upsell-option");

         // Paseo cada una de las entradas
         for (Element elem : entradas) {
             String titulo = elem.getElementsByClass("price-disclaimer").text();

             System.out.println("Precio para los miembros GOLD: " + titulo+"\n");
             listaEmpresaA.get(4).add(titulo);

         }

         filas++;

     }

     contador_juegos++;
    }


    //<--------------- FINISH OF THE SCRAPING FOR EACH LINK BAZAR USA   

2.- 创建Excel 并将listaEmpresaA arrayList中的信息存储到Excel中。

try {
         //create .xls and create a worksheet.
         FileOutputStream fos = new FileOutputStream("D:\\mierda.xls");
         HSSFWorkbook workbook = new HSSFWorkbook();
         HSSFSheet worksheet = workbook.createSheet("XboxOne");

            int l=0;

                //CREATING EXCEL ROWS
             for (int f=0; f< filas ; f++) {
                HSSFRow fila = worksheet.createRow(f);

                //CREATING EXCEL COLUMNS
                for(int c=0;c<total_columnas;c++){
                       HSSFCell celda = fila.createCell(c);
                       celda.setCellValue(listaEmpresaA.get(c).get(f)); //<----- THIS IS THE LINE 305 WHERE I HAVE THE ERROR
                       l++;

                }      
             }

        //Save the workbook in .xls file
         workbook.write(fos);
         fos.flush();
         fos.close();
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }

我有很多问题,如果你能给我一些提示,我会非常感激,这样我才能找到解决方案:

1.-我不明白为什么在程序运行到此时Index: 393, Size: 393显示问题,直到总链接的索引2730(总共2.751个链接)。控制台上显示的最后一个数据是:

  

2730.- Comprobando entradas de:https://www.microsoft.com/en-us/store/p/star-wars-pinball-season-1-bundle/brz3mqfjnlmw   星球大战™弹球第1季捆绑

     

Precio base:

     

Precio para los miembros sin GOLD:

     

线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:393,大小:393   at java.util.ArrayList.rangeCheck(ArrayList.java:653)   at java.util.ArrayList.get(ArrayList.java:429)   在scraping.complementos_juegos.main(complementos_juegos.java:305)

2.-当我使用for-each bucle时,我意识到它并没有完全按照数组上的顺序设置。我不知道为什么。

3.-该计划花费1小时仅仅是为了从一家商店中删除信息,我希望存储超过50个,¿有没有办法减少这个时间?我读过一些关于“HashMap”的内容,但我不知道如何使用它们。无论如何,如果这是一个更好的解决方案,我会看看。

提前致谢!

祝你有个美好的一天。

0 个答案:

没有答案