2014-09-23 42 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

'next'的內容是什麼? – rgettman 2014-09-23 16:27:14

+1

什麼是'dataz'?這不在你發佈的代碼中。 – CPerkins 2014-09-23 16:27:22

+0

這意味着你的輸入中有一行沒有逗號。 – 2014-09-23 16:28:42

回答

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回來的令牌數修正:

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

這種情況也涵蓋了情況,當修剪next是空的,所以不需要單獨的檢查。

1

您確實需要確保您輸入的輸入數量是您期望的輸入數量,一個簡單的檢查就是檢查從split獲得的derp數組中的參數數量。

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; 
} 
}