2017-03-19 5 views
0

私はこのコード部分を実行しているときに、レッスンのhashmapが空であるため、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

あなたがマップにデータを挿入しているところであるLessonsMapのコンストラクタを呼び出すことはありません。

あなたはlessonsは、静的ではないにし、このようなLessonsMapオブジェクト作成できます。

LessonsMap lessonsMap = new LessonsMap(); 

、その後lessonslessonsMap.lessonsを用いて充填し、アクセスされるだろう。 How can I initialise a static Map?

1

例外が表示されているので、ハッシュマップは空ではありません。

ので、あなたのコード内の

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

あなたはクラスLessonMapから静的な方法でレッスンを呼び出しているので、あなたのクラスのコンストラクタが呼び出されることはありませんので、レッスンは常に空になります! LessonMapのインスタンスを次のように作成できます。LessonMap lessonMap = new LessonMap()

newは、クラスのオブジェクトを作成してコンストラクタを呼び出します。

あなたがそうあなたは、キー/値のプットにブロック相対を呼び出すことはありませんLessonsMapを初期化せずに、静的メソッドにアクセスしているので、あなたはJavaで

0

を静的コンストラクタをすることはできません。

次のような静的なinitメソッドの追加、それを解決することができます: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

を。あなたはクラス内の静的変数に到達するからです。ハッシュマップは、静的な初期化ブロックで埋めなければなりません。これを試してみてください:

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


} 
関連する問題