为什么在访问填充的arraylist时会抛出“java.lang.IndexOutOfBoundsException”?

时间:2014-01-02 18:50:21

标签: java exception

这是我的主要课程:

package main;

public class Main_Class {
    public static void main(String[] args) {
        Game_Map_Handler GMH = new Game_Map_Handler();
        GMH.AddData("adad");
        System.out.println(GMH.RetrieveData());
    }
}

这是我的另一个类(Game_Map_Handler):

package main;
import java.util.*;

public class Game_Map_Handler {
public List<String> Map_Data = new ArrayList<String>(); 

public void AddData(String InData) {
    List<String> Map_Data = new ArrayList<String>();    
    Map_Data.add(InData);
}

public String RetrieveData() {
    String To_Return = Map_Data.get(0);
    return To_Return;
}

这是错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at main.Game_Map_Handler.RetrieveData(Game_Map_Handler.java:13)
at main.Main_Class.main(Main_Class.java:7)

为什么会出现这种错误?似乎在“Map_Data”中没有填充任何内容,但是我做了填充它。

3 个答案:

答案 0 :(得分:15)

Map_Data方法中的AddData变量是shadowing

public void AddData(String InData) {
    List<String> Map_Data = new ArrayList<String>();   //<-- remove this line 
    Map_Data.add(InData);
}

答案 1 :(得分:5)

public void AddData(String InData) {
    List<String> Map_Data = new ArrayList<String>(); <----
    Map_Data.add(InData);
};    

在这里,您要创建一个新列表,而不是添加实例成员。回来的时候,你是从实例成员那里获得的。

只需将该方法更改为

即可
public void AddData(String InData) {

    Map_Data.add(InData);
}

作为旁注,请遵循java命名约定,即变量名称应以小写字母开头,即它应为map_Data

答案 2 :(得分:4)

您必须使用this运算符

this.Map_Data.add(InData);

在您的函数中,您使用的是本地声明的列表,而不是类中的列表。