Hashmap为空

时间:2017-03-19 17:31:33

标签: java android hashmap indexoutofboundsexception

当我运行这部分代码时,我得到IndexOutOfBoundException,因为课程hashmap为空。我在Debugger中检查了它。你能解释一下为什么它是空的吗?我用数据填充它,但它无法正常工作。

public class ScheduleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.schedule_activity);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new SchedulePagerAdapter(getFragmentManager()));

    }

}


class SchedulePagerAdapter extends FragmentPagerAdapter {

    public SchedulePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return DayFragment.newInstance();
    }

    @Override
    public CharSequence getPageTitle(int position) {

        ArrayList<String> arrayList = new ArrayList<>();
        for (String key : LessonsMap.lessons.keySet()) {
            arrayList.add(key);
        }
        return arrayList.get(position);

    }

    @Override
    public int getCount() {
        return 6;
    }

}


class LessonsMap {

    public static Map<String, String> lessons = new HashMap<String, String>();

    public LessonsMap() {

        lessons.put("Monday", "Test_Data");
        lessons.put("Tuesday", "Test_Data");
        lessons.put("Wednesday", "Test_Data");
        lessons.put("Thursday", "Test_Data");
        lessons.put("Friday", "Test_Data");
        lessons.put("Saturday", "Test_Data");


    }

}

谢谢!

4 个答案:

答案 0 :(得分:1)

当你看到异常时,hashmap为空而不是null!

因为在您的代码中public static Map<String, String> lessons = new HashMap<String, String>();

由于您是从Class LessonMap以静态方式调用课程,因此课程将始终为空,因为您的类的构造函数永远不会被调用! 您可以像这样创建LessonMap的实例:LessonMap lessonMap = new LessonMap()

new将成为类的对象并调用构造函数。

您无法在java中创建静态构造函数

答案 1 :(得分:1)

LessonMap类中的构造函数未运行。因为你在课堂上达到静态变量。您必须在静态初始化块中填充Hashmap。试试这个:

 public static Map<String, String> lessons = new HashMap<String, String>();

static {

lessons.put("Monday", "Test_Data");
lessons.put("Tuesday", "Test_Data");
lessons.put("Wednesday", "Test_Data");
lessons.put("Thursday", "Test_Data");
lessons.put("Friday", "Test_Data");
lessons.put("Saturday", "Test_Data");


}

答案 2 :(得分:0)

因为您在不初始化LessonsMap的情况下访问静态方法,所以您永远不会相对于键/值的放置调用块。

你可以解决它添加这样的静态init方法:

public static Map<String, String> lessons = initLessons();

private static Map<String, String> initLessons() {
    Map<String, String> lessons = new HashMap<>();
    lessons.put("Monday", "Test_Data");
    lessons.put("Tuesday", "Test_Data");
    lessons.put("Wednesday", "Test_Data");
    lessons.put("Thursday", "Test_Data");
    lessons.put("Friday", "Test_Data");
    lessons.put("Saturday", "Test_Data");
    return lessons;
}

答案 3 :(得分:0)

您永远不会调用LessonsMap的构造函数,而这是您在地图中插入数据的位置。

您可以使lessons不是静态的,并创建一个LessonsMap对象,如下所示:

LessonsMap lessonsMap = new LessonsMap();

然后使用lessons填充和访问lessonsMap.lessons

否则,如果您想保持lessons静态,则应使用此处讨论的方法之一对其进行初始化:How can I initialise a static Map?