2017-03-19 4 views
0

코드의이 부분을 실행할 때 해시 맵이 비어 있기 때문에 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"); 


    } 

} 

고마워요!

+0

'당신'LessonsMap.lessons.keySet을 (수행 할 때 lessons'가 아직 데이터가 작성되지 않았습니다) ': 정적 lessons을 유지하려는 경우

그렇지 않으면, 당신은 여기에 설명 된 방법 중 하나를 사용하여 초기화한다 이것은 정적 필드이기 때문에 생성자에서 채 웁니다. 이 기능을 사용하려면'LessonsMap' 클래스의'static' 블록에서'lessons' 맵을 초기화해야합니다. @ArolaAb 응답도 유효합니다. – myhau

+0

사이드 엣지 : 처음부터 정적을 사용하지 마십시오. 실제 객체를 인스턴스화하고 해당 객체에 대한 메소드를 호출합니다. – GhostCat

답변

0

.

당신은 lessons이 아닌 정적하고이 같은 LessonsMap 개체를 만들 수 있습니다

LessonsMap lessonsMap = new LessonsMap(); 

을 다음 lessons가 작성 될 접근 lessonsMap.lessons를 사용하여. How can I initialise a static Map?

1

예외가 표시되는 것처럼 해시 맵은 null이 아닙니다! 코드에서 public static Map<String, String> lessons = new HashMap<String, String>();

당신이 클래스 LessonMap에서 정적 방법으로 수업을 호출하기 때문에 때문에 클래스의 생성자가 호출되지 않기 때문에

는 교훈은 항상 비어있을 것입니다! LessonMap의 인스턴스를 다음과 같이 만들 수 있습니다. LessonMap lessonMap = new LessonMap()

new은 클래스의 객체를 만들고 생성자를 호출합니다. 당신은 그래서 당신은/키 값의 풋에 블록 상대를 호출하지 LessonsMap를 초기화하지 않고 정적 메소드에 액세스하기 때문에

당신은 자바

0

에 정적 생성자를 만들 수 없습니다.

당신은 다음과 같은 정적 초기화 방법을 추가 해결할 수 : LessonMap 클래스의 생성자가 실행되고 있지

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

감사합니다! 정말 감사드립니다! – Konstantin

1

. 왜냐하면 당신은 클래스에서 정적 변수에 도달하기 때문입니다. 정적 초기화 블록에서 해시 맵을 채워야합니다. 이 시도 : 당신은 결코 당신이지도에 데이터를 삽입하는 곳이다 LessonsMap의 생성자를 호출하지 않습니다

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


}