2017-03-06 9 views
0

배열의 상한을 변경하여 범위를 벗어난 인덱스를 제거하는 다양한 방법을 시도했습니다. 그러나 오류가 계속 발생합니다. 내가 어디로 잘못 가고 있니?내 프로그램에서 인덱스 바운드 오류를 제거하는 방법은 무엇입니까?

Screenshot of my excel sheet

내 프로그램은 엑셀 시트의 첫 번째 열에있는 값 (모든 행)를 판독하고, 최대 값을 찾는다. 그런 다음 최대 값을 기준으로 기준이 공식화되고 값이 낮음, 보통, 높음으로 분류되어 새로운 Excel 시트로 다시 작성됩니다.

import java.io.FileInputStream; 
import java.io.IOException; 
import jxl.Cell; 
import jxl.Sheet; 
import jxl.Workbook; 
import jxl.read.biff.BiffException; 
import java.io.*; 
import java.util.*; 
import jxl.write.WritableSheet; 
import jxl.write.WritableWorkbook; 
import jxl.write.Label; 
import jxl.write.WriteException; 

public class Bus3{ 

List<String> numbusarray = new ArrayList<String>(); 
List<String> numcommutersarray = new ArrayList<String>(); 
List<String> numcommercialarray = new ArrayList<String>(); 
    static WritableWorkbook workbook; 
     static WritableSheet wSheet; 


public void readExcel() throws BiffException, IOException, WriteException//method to read  contents form excel 
{ 
    String FilePath = "Bus1.xls"; 
    Scanner sc = new Scanner(System.in); 
    int max=0; 

    FileInputStream fs = new FileInputStream(FilePath); 
    Workbook wb = Workbook.getWorkbook(fs); 
    Sheet sh = wb.getSheet("Bus1");// TO get the access to the sheet 
    int totalNoOfRows = sh.getRows();// To get the number of rows present in sheet 
    int totalNoOfCols = sh.getColumns();// To get the number of columns present in sheet 
    System.out.println(totalNoOfRows); 
    //adding excel contents from every column to arraylist 
    for (int row = 1; row <totalNoOfRows; row++) 
    { 
     numbusarray.add(sh.getCell(2, row).getContents()); 
    } 


    for (int row = 1; row <totalNoOfRows; row++) 
    { 
     numcommutersarray.add(sh.getCell(3, row).getContents()); 
    } 

    for (int row = 1; row <totalNoOfRows; row++) 
    { 
     numcommercialarray.add(sh.getCell(4, row).getContents()); 
    } 
    //to find maximum of numbusarray 
    max=Integer.parseInt(numbusarray.get(0)); 
    for (int row = 1; row < totalNoOfRows-1; row++) 
    { 
       if(!(numbusarray.get(row)).isEmpty()) 
       { 
       int intNumber=Integer.parseInt(numbusarray.get(row)); 
       if(intNumber>max) 
       { 
       max=intNumber; 
       //System.out.println(max); 
       } 
       } 


    } 
    System.out.println(max); 
    WritableWorkbook workbook = Workbook.createWorkbook(new File("sampletestfile.xls")); 
    WritableSheet wSheet = workbook.getSheet(0); 
    int increment=max/3; 
    int a=increment; 
    int b=a+increment; 
    int c=b+increment; 
    for (int row = 0; row < totalNoOfRows-1; row++) 
    { 
       if(!(numbusarray.get(row)).isEmpty()) 
       { 
       int compare=Integer.parseInt(numbusarray.get(row)); 
       if(compare<=a) 
       {Label label= new Label(0, row, "Low");//column,row,strngdata 
       wSheet.addCell(label);} 
       else if((compare>a)&&(compare<=b)) 
       {Label label= new Label(0, row, "Medium");//column,row,strngdata 
       wSheet.addCell(label);} 
       else 
       {Label label= new Label(0, row, "High");//column,row,strngdata 
       wSheet.addCell(label);} 
       } 
    }    
/*Iterator itr=numbusarray.iterator(); //to print arraylist demo 
    while(itr.hasNext()){ 
     System.out.println(itr.next()); 
    }*/ 
    }//end of method to read contents from excel 
    //to close file 
    public static void closeFile() 
    { 
     try { 
      // Closing the writable work book 
      workbook.write(); 
      workbook.close(); 

      // Closing the original work book 
     } catch (Exception e) 

     { 
      e.printStackTrace(); 
     } 
    } 


    public static void main(String args[]) throws BiffException, IOException, WriteException //main class 
    { 
     Bus3 DT = new Bus3(); 
     DT.readExcel(); 
     Bus3.closeFile(); 
    }//end of main class 

} 
+0

디버그를, 그렇지 않으면 스택 추적 –

+0

시작 행을 0으로 게시하십시오. 1에서 시작하지 마십시오. i = 1로 초기화하는 모든 for 루프를 i = 0로 만듭니다. 그런 다음 –

+0

'row Maverick

답변

1

당신의 쉬 Sheet.class 객체가 열이 세포 = 4 이없는이 그것을 수정해야하기 때문입니다 :

for (int row = 1; row < totalNoOfRows; row++) { 
     numbusarray.add(sh.getCell(1, row).getContents()); 
    } 

    for (int row = 1; row < totalNoOfRows; row++) { 
     numcommutersarray.add(sh.getCell(2, row).getContents()); 
    } 

    for (int row = 1; row < totalNoOfRows; row++) { 
     numcommercialarray.add(sh.getCell(3, row).getContents()); 
    } 

최종 편집 :

for (int row = 1; row < totalNoOfRows; row++) { 
     numbusarray.add(sh.getCell(1, row).getContents()); 
    } 

    for (int row = 1; row < totalNoOfRows; row++) { 
     numcommutersarray.add(sh.getCell(2, row).getContents()); 

    } 

    for (int row = 1; row < totalNoOfRows; row++) { 
     numcommercialarray.add(sh.getCell(3, row).getContents()); 
    } 
    // to find maximum of numbusarray 
    max = 0; 
    for (int row = 1; row < totalNoOfRows; row++) { 
     if (!(numbusarray.get(row - 1)).isEmpty()) { 
      int intNumber = Integer.parseInt(numbusarray.get(row - 1)); 
      if (intNumber > max) { 
       max = intNumber; 
       System.out.println("max: " + max); 
      } 
     } 

    } 
    System.out.println(max); 
    workbook = Workbook.createWorkbook(new File("sampletestfile.xls")); 
    WritableSheet wSheet = workbook.createSheet("name", 0); 
+0

앞으로 두 줄이 더 있습니다. 버스의 수는 나의 ​​제 3의 칼럼이다. 그래서 나는 색인 2가 옳다라고 생각한다. @Rinat – Zac

+0

또한 변경해야합니다. max = 0; 위한 \t \t (INT 행 = 1, 로우 Rinat

+0

And this : workbook = Workbook.createWorkbook (새 파일 ("sampletestfile.xls")); \t \t WritableSheet wSheet = workbook.createSheet ("name", 0); – Rinat

1

매우 복잡한 문제는 아닙니다. 범위를 벗어난 인덱스는 존재하지 않는 배열의 위치에 액세스하려고한다는 것을 의미합니다. numbusarray 변수를 확인하십시오. 아마도 row이 잘못된 색인으로 설정됩니다.

+0

예외를 displyed되는 "기본"java.lang.IndexOutOfBoundsException : 인덱스 : 0, 크기 : java.util.ArrayList.rangeCheck에서 (ArrayList.java:653) at java.util.Array jxl.write.biff.WritableWorkbookImpl.getSheet에서 List.get (ArrayList.java:429) (WritableWorkbookImpl.jav A : 399) Bus3.main (Bus3에서 Bus3.readExcel (Bus3.java:69) 에서 . java : 115) – Zac

+0

위 오류가 표시됩니다. numbusarray 배열에는 14 개의 용어가 들어 있습니다. 그래서 0-13은 내가 numbusarray에 부여한 한도입니다 – Zac