0

.CSV 파일을 구문 분석하고 있습니다. 줄 다음에 한 줄을 가져오고 열 값을 가져 오려고합니다. 그래서 내 .CSV 파일로 예 : 내가 한 그래서배열의 마지막 요소에 액세스 할 수 없습니다.

time;columnA;columnB,ColumnC 
27-08-2013 14:43:00; this is a text; this too; same here 

가 bidimensional String 배열의 콘텐츠를 저장하는 것입니다 ((분할 감사)). 내 배열이 다음과 같이 이루어진다 :

array[0][x] = "time". 
array[y][x] = "27-08-2013 14:43:00"; 

들은 다른 열에 X이지만 열마다의 이름 만 행에 저장된다 [0] [X]. 그들은 값이 String으로 저장된 y 개의 다른 행입니다.

내 문제는 다음과 같습니다. 데이터의 [x] 위치를 가져오고 싶지만 배열의 마지막 [x] 요소에 액세스하려고합니다. 나는 오류 메시지

java.lang.ArrayIndexOutOfBoundsException: 17 
    at IOControl.ReadCsvFile.getPosVar(ReadCsvFile.java:22) 
    at IOControl.ReadCsvFile.<init>(ReadCsvFile.java:121) 
    at en.window.Main.main(Main.java:48) 
분명히

내가 지금까지에 읽고 있어요,하지만 방법으로 이것을받을? 여기

내 코드 :

//Retrieves the x position of the variable var given as parameter. 
private int getPosVar(String[][] index, String var) 
{ 
    int x = 0; 
    boolean cond = false; 
    while((index[0][x] != null) && (cond != true)) 
    { 
     if (index[0][x].contains(var) == true) 
     { 
      cond = true; 
     } 
     x++; 
    } 
    System.out.println("x = " +x+ " val = " +index[0][x]); 
    return(x); 
} 

나는 내 x 값이 전체 문자열보다 작은 것을 선택하지 않았기 때문에이 될 수있다 생각했다. 이 같은 :

x < index[x].length 

그러나 사실 난 아무것도 변경되지 않았고, 내가 알 수없는 String var을 줄 때 그것은 또한 너무 멀리 간다. 왜?

+0

당신은 4 열을 가지고 있지만, 액세스 (17) 시도? –

+0

아니, 내 실제 테스트 파일에서 나는 엄청난 양의 데이터를 가지고있다. 하지만 실제로 17 열을 가지고 있으며, 17st에 액세스하려고 시도합니다.) – trolologuy

+0

17 열이있는 경우 인덱싱이 0부터 시작되기 때문에 마지막 인덱스는 16입니다. 디버거를 사용하여 코드를 살펴보십시오. –

답변

2

그것도 좋은 생각이다 사용하기 전에 인덱스의 유효성을 확인하여

while (x < index[0].length) 
{ 
    if (index[0][x] == null) 
    { 
     x++; 
     continue; // skip possible null entries. 
    } 

    if (index[0][x].contains(var)) 
    { 
     System.out.println("x = " + x + ", val = " + index[0][x]); 
     return x; // return the position found. 
    } 
    x++; 
} 
return -1; 

(내가 좋아하는) for 루프 :

for (int x = 0; x < index[0].length; x++) 
{ 
    if (index[0][x] == null) 
     continue; // skip possible null entries. 

    if (index[0][x].contains(var)) 
    { 
     System.out.println("x = " + x + ", val = " + index[0][x]); 
     return x; // return the position found. 
    } 
} 
+0

나는 그것이 쉬울 수 있다고 생각하지 못했습니다. o 이상합니다. 휴식은 확실히 도움이됩니다! 감사합니다. – trolologuy

+0

@trolologuy, 메소드 내에 있어야 할 경우'break'를 사용하십시오. 그렇지 않으면'return'을 사용하여 이후의 결과를 리턴하십시오. – munyul

0

배열 경계를 완전히 무시하고 있습니다. while 루프에서 x 변수가 너무 크지 않은 것은 어디에서 확인합니까? 아무데도.

+0

나는 이것을 시도했다 :'x trolologuy

1

X < 지수 [X] .length

문제 index[x]의 길이가 아니라, 그 x 너무 크다. 다음을 확인해야합니다.

index.length < x 
+0

흠 내가 색인을 할 때 너무 [X] 인덱스 i [X]의 문자열의 길이를 확인 않으며, 내가 확인 할 때 단순히 동일 하 X? – trolologuy

+0

@trolologuy은'index.length' 메인 어레이 인덱스 '[X] .length'의 길이 배열 위치에있는'x'의 길이이다. 'index [x] [y] .length'는'(x, y)'에있는 문자열의 길이가됩니다. – kiheru

+0

음, 말 ^^ 고마워 상당히 논리는, 지금 내가 바로 그것을 얻을 않았다, 그런 식으로 이해되지 않았다. – trolologuy

0

while 루프의 끝에서 x의 값을 늘립니다. 그런 다음 sysout 메소드에서 다시 값을 얻으려고 시도합니다.

편집 : x ++을 else 블록에 넣으십시오.

if (index == null || index.length == 0) return -1; 

귀하의 while 루프보다 다음과 같아야합니다 :

1

당신이

에 대해 확인해야합니다3210
x < index[0].length 

과는 전혀 인덱스를 액세스하기 전에

index != null && index.length > 0 

을 확인하는 좋은 것입니다.

올바른 결과를 찾으면 코드가 "x ++"를 증가 시켜서 x가 한 요소를 더 멀리 이동시킵니다. 이제 마지막 요소를 찾거나 경우 은/어떤 요소는 다음이 오류가 발생합니다 따라서

System.out.println("x = " +x+ " val = " +index[0][x]); 

, 배열 경계를 오버플로 관리하지 않습니다.

I는 다음과 같이 변경하는 것이 좋습니다 것입니다 :

private int getPosVar(String[][] index, String var) 
{ 
    int x = 0; 
    boolean found = false; 

    if(index == null || index.length == 0 || var == null) 
     return -1; 

    while((x < index[0].length)) 
    { 
     if (index[0][x].contains(var)) 
     { 
      System.out.println("x = " +x+ " val = " +index[0][x]); 
      return(x); 
     } 
     x++; 
    } 
    System.out.println(" var = " + var + " not found"); 
    return -1; 
} 
0

당신이 검사를 수행 한 후이 값을 증가하는 Becase. 그러면 다음 수표가 너무 많이 이어집니다. 다음과 같이 브레이크 문을 추가하면됩니다.

public static void main(String[] args) { 
    String var = "c"; 
    String[][] index = {{"a","b","c"},{"a","b","c"}}; 
    int x = 0; 
    boolean cond = false; 
    while((index[0][x] != null) && (cond != true)) 
    { 
     if (index[0][x].contains(var) == true) 
     { 
      cond = true; 
      break; 
     } 
     x++; 
    } 
    System.out.println("x = " +x+ " val = " +index[0][x]); 

또한 당신은 항상 당신이 배열의 길이를 확인하는 경우가 훨씬 더 열심히 이와 같은 오류를 얻을 수 있도록 forloop 대신 while 루프를 사용하려고합니다.

0

당신은 당신의 오래된 프로그램

공용 클래스 TwoDStringArray {

static String[][] index = new String[1][3]; 

public static void main(String[] args) { 

    index[0][0] = "amal"; 
    index[0][1] = "dev"; 

    int x = 0; 
    boolean cond = false; 
    String var = "dev"; 
    while((index[0][x] != null) && (cond != true)) 
    { 

     if (index[0][x++].equals(var) == true) 
     { 
      cond = true; 
      x--; 
     } 
    } 

    System.out.println("x = " +x+ " val = " +index[0][x] + " "+ cond); 
} 

}

O/P ---- >>>

X = 1 발 = dev에 사용할 수 있습니다 사실


하지만 당신은 당신이 정적 문자열 [] [] 인덱스 = 새로운 문자열을 선언 할 때 한 가지주의해야 [1] [3] 여기

컴파일러 [0] [0] = NULL 인덱스는 [0] [1] = NULL 인덱스는 [0] [2] 널

를 = 있지만 최소가 인덱스와 '인덱스를 "초기화 인덱스 [0] [3]

그래서 표시됩니다는 ArrayIndexOutOfBoundsException 다음이

정적 문자열처럼 '인덱스'를 선언 프로그램에서 'N'요소가있는 경우

너무 한 일을 [] [] index = 새 문자열 [1] [n + 1];

관련 문제