2014-09-23 2 views
0

런타임시 String weapon = dataz[1]; 라인에서 경계 밖의 배열 인덱스 예외가 발생합니다. 이것이 이전 과제에서 사용했던 코드와 거의 같기 때문에 이것이 무엇을 유발하는지 확신 할 수 없습니다. 왜 이런 일이 일어나고 있는지에 대한 모든 논리는 대단히 감사하겠습니다!어레이가 경계를 벗어나는 이유를 잘 모르는 경우 Java

public Hero[] getHeroes(){ 

    String file = getFilePath(); 
    Hero[] heroPower = new Hero[5]; 

    int i=0; 
    try{ 
    Scanner data = new Scanner(file); 
    while(data.hasNextLine() && i < 5) 
    { 
     String next = data.nextLine(); 
      if(!next.trim().isEmpty()) 
      { 
       String[] derp = next.split(","); 
       String name = derp[0]; 
       String weapon = derp[1]; 
       int attackPoints = Integer.parseInt(derp[2]); 
       heroPower[i] = new Hero(name,weapon,attackPoints); 
       i++; 
      } 
     } 
    data.close(); 
    } finally { 

    } 
    return heroPower; 
    } 
} 
+1

'다음'의 내용은 무엇입니까? – rgettman

+1

'데이터 '란 무엇입니까? 게시 한 코드에는 없습니다. – CPerkins

+0

입력란에 쉼표가없는 행이 있음을 의미합니다. –

답변

1

next 문자열은 아마도 분할되지 않습니다. ,이 없으며 해당 옵션을 확인하지 않습니다. 사용하기 전에

String[] derp = next.split(","); // split by commas a word that has no commas so derp.length == 1 
String name = derp[0];   // this is ok since length is 1 
String weapon = derp[1];   // this is error 

당신은 derp.length를 확인해야합니다 :

0

이 문제는 대부분 사용자의 입력은, 어떤 , 문자를 포함하지 않는됩니다

String[] derp = next.split(","); 
if(!derp.length == 3) { // because name=derp[0], weapon=derp[1], attackPoints = derp[2] 
    // ... create name, weapon, points and assign to heroPower 
} else { 
    System.out.println("Invalid input"); 
} 
1

귀하의 코드가 제대로 빈 줄을 처리, 입력에 적어도 세 개의 토큰이 없으면 실패합니다. derp[0], derp[1]derp[2]이 유효하다고 가정하지만 유효성은 입력에 따라 다릅니다.

당신은 당신이 next.split에서 돌아 토큰의 수를 확인하여 문제를 해결할 수 있습니다 트리밍 next, 그래서 별도의 검사가 필요하지 않습니다 비어있을 때

String next = data.nextLine(); 
String[] derp = next.split(","); 
if(derp.length >= 3) { 
    ... 
} 

이 조건은 또한 상황을 설명합니다.

1

실제로 입력 할 입력 수가 예상 입력 수인지 확인해야합니다. 간단한 검사는 분할에서 가져온 인수 배열의 인수 수를 확인하는 것입니다.

public Hero[] getHeroes(){ 

    String file = getFilePath(); 
    Hero[] heroPower = new Hero[5]; 

    int i=0; 
    try{ 
    Scanner data = new Scanner(file); 
    while(data.hasNextLine() && i < 5) 
    { 
     String next = data.nextLine(); 
      if(!next.trim().isEmpty()) 
      { 
       String[] derp = next.split(","); 
       //This is the line to change 
       if(derp > 3){ 
        String name = derp[0]; 
        String weapon = derp[1]; 
        int attackPoints = Integer.parseInt(derp[2]); 
        heroPower[i] = new Hero(name,weapon,attackPoints); 
        i++; 
       }else{ 

        //throw an error 

       } 
      } 
     } 
    data.close(); 
    } finally{ 

    } 
    return heroPower; 
} 
} 
관련 문제