2012-01-31 5 views
2

파일을 읽고 목록에 추가 한 다음 목록을 읽고 문자열을 분할하여 비교 한 다음 그 내용과 함께 수행하십시오.왜 ArrayIndexOutOfBoundsException가 발생합니까?

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

난 내 코드를 수정해야합니다 나는이 예외가?

for (Productname m : listIP) { 
     if (m.getIdentifier() == null || m.getProductname() == null) { 
       addToNonSimilarList(m.getProductname()); 
     } else { 
      String id = m.getIdentifier().replaceAll("(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", " ").toUpperCase(); 
      String product = m.getProductname().replaceAll("(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z])", " ").toUpperCase(); 
      id = id.replaceAll("\\s+", " "); 
      product = product.replaceAll("\\s+", " "); 
      if (!id.equalsIgnoreCase(product)) { 
       if (id.contains(" X ") && product.contains(" X ")) { 
        String[] ide = id.split(" (?=X\\s*\\d+)"); 
        String[] prod = product.split(" (?=X\\s*\\d+)"); 
        System.out.println(m.getMnemonic()); 
        if (ide.length > 0 && prod.length > 0 && ide[1].trim().equalsIgnoreCase(prod[1].trim())) { 
         String[] i = ide[0].split(" (?=\\d+)"); 
         String[] p = prod[0].split(" (?=\\d+)"); 
         if (i[0].trim().equalsIgnoreCase(p[0].trim())) { 
          //do nothing 
         } else { 
          addToNonSimilarList(m.getProductname()); 
         } 
        } else { 
         addToNonSimilarList(m.getProductname()); 
        } 
       } else { 
        addToNonSimilarList(m.getProductname()); 

       } 
      } 
     } 

    } 

답변

2

음,이 조건은 맛없어 보이는 각 적어도 하나 요소가 있다면 당신은 테스트하고 있지만, 각각의 요소를 사용하고

if (ide.length > 0 && prod.length > 0 
    && ide[1].trim().equalsIgnoreCase(prod[1].trim())) { 

.

달성하려는 내용을 말하기는 어렵지만 length 조건이나 배열 색인을 변경하려고합니다. 나는 또한이 방법을 더 짧은 것들로 나눠서, 아마도 명확한 의미로 Pattern 객체에 대한 참조와 함께 잘 알려진 정적 변수를 만들 것입니다 ...

EDIT : 진정으로 각 배열의 두 번째 요소를 사용하려면 제안 거라고 :

if (ide.length > 1 && prod.length > 1 
    && ide[1].trim().equalsIgnoreCase(prod[1].trim())) { 
+0

예이 두 개의 ide [1] prod [1]의 두 번째 요소가 같은지 확인해야합니다. ** 더 나은 방법은 무엇입니까? ** – itro

+0

@itro : 최소한 하나가 아닌 각 배열에 * 적어도 두 개의 요소 *가 있는지 확인하십시오. –

1
if (ide.length > 0 && prod.length > 0 && ide[1].trim().equalsIgnoreCase(prod[1].trim())) 

길이가 다음의 첫 번째 요소는 IDE [0] 자극 [0] 그러나 IDE를 사용하는 [1] 프로드 [의해 액세스 될 수있는 하나 같으면 1]. 그것이 오류의 원인입니다.

+0

'ide.length> 0 && prod.length> 0'을 제거하면 같은 오류가 발생합니다. 모든 분할의 두 번째 요소를 확인해야합니다. 가장 좋은 방법은 무엇입니까? – itro

+0

당신은 첫 번째 요소가 ide [1] 대신 prod [1]이 처리되고 ide [0]과 prod [0]을 사용한다고 가정하고 있습니다. –