【问题标题】:Hashmap is empty哈希图为空
【发布时间】:2017-03-19 17:31:33
【问题描述】:

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

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");


    }

}

谢谢!

【问题讨论】:

  • lessons 在您执行LessonsMap.lessons.keySet() 时尚未填充数据,因为它是一个静态字段,您正在构造函数中填充它。要使其工作,您应该在 static 块内的 LessonsMap 类中初始化 lessons 映射。 @ArolaAb 答案也是有效的。
  • 侧鼻:首先不要使用静态。实例化真实对象;并在这些对象上调用方法。

标签: java android hashmap indexoutofboundsexception


【解决方案1】:

正如您看到的异常,哈希图为空而不是空!

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

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

new 将创建一个类的对象并调用构造函数。

您不能在 java 中创建静态构造函数

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您可以使lessons 不是静态的,并像这样创建一个LessonsMap 对象:

      LessonsMap lessonsMap = new LessonsMap();
      

      然后lessons 将被填充并使用lessonsMap.lessons 访问。

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

      【讨论】:

        【解决方案4】:

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

        你可以像这样添加一个静态初始化方法来解决它:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-30
          • 1970-01-01
          • 2013-10-09
          • 2013-03-21
          • 2022-12-10
          • 1970-01-01
          • 1970-01-01
          • 2016-04-20
          相关资源
          最近更新 更多