Массив месяцев бросает ArrayIndexOutOfBoundException java

В моем приложении календаря Хиджры, если я нажму кнопку следующего месяца и дойду до конца года (т. е. до последнего месяца) или если я нажму кнопку «Предыдущий месяц», пока не дойду до начала года (т. е. до первого месяца) , приложение вылетает и выдает java.lang.ArrayIndexOutOfBoundsException

    private ImageView calendarToJournalButton;
    private Button selectedDayMonthYearButton;
    private final String[] hmonths = {"Muharram", "Safar", "Rabi al-Awwal", "Rabi al-Akhir", "Jamadi al-Awwal", "Jamadi al-Akhir", "Rajab", "Shabaan", "Ramadhan", "Shawwal", "Zilqad", "Zilhajj"};
    private Button currentMonth;
    private ImageView prevMonth;
    private ImageView nextMonth;
    private GridView calendarView;
    private GridCellAdapter adapter;
    private Calendar _calendar;
    private int month, year, hmonth, hyear;
    private final DateFormat dateFormatter = new DateFormat();
    private static final String dateTemplate = "MMMM yyyy";
    private String hmonthname;
    private HijriCalendar hijri;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.simple_calendar_view);

            _calendar = Calendar.getInstance(Locale.getDefault());
            hijri = new HijriCalendar(_calendar.get(Calendar.YEAR),_calendar.get(Calendar.MONTH),_calendar.get(Calendar.DAY_OF_MONTH));

            month = _calendar.get(Calendar.MONTH) + 1;
            year = _calendar.get(Calendar.YEAR);

            hmonth = hijri.getHijriMonth();
            hmonthname = hijri.getHijriMonthName();
            hyear = hijri.getHijriYear();

            Log.d(tag, "Calendar Instance:= " + "Month: " + month + " " + "Year: " + year);
            Log.d(tag, "Islamic Calendar Instance:= " + "Month: " + hmonth + " " + "Year: " + hyear);

            selectedDayMonthYearButton = (Button) this.findViewById(R.id.selectedDayMonthYear);
            selectedDayMonthYearButton.setText("Selected: ");

            prevMonth = (ImageView) this.findViewById(R.id.prevMonth);
            prevMonth.setOnClickListener(this);

            currentMonth = (Button) this.findViewById(R.id.currentMonth);
            currentMonth.setText(DateFormat.format(dateTemplate, _calendar.getTime()) + " | " + hmonthname + " " + hyear);

            nextMonth = (ImageView) this.findViewById(R.id.nextMonth);
            nextMonth.setOnClickListener(this);

            calendarView = (GridView) this.findViewById(R.id.calendar);

            // Initialised
            adapter = new GridCellAdapter(getApplicationContext(), R.id.calendar_day_gridcell, month, year, hmonth, hyear);
            adapter.notifyDataSetChanged();
            calendarView.setAdapter(adapter);
        }


    /**
     * 
     * @param month
     * @param year
     */
    private void setGridCellAdapterToDate(int month, int year, int hmonth, int hyear)
        {
            adapter = new GridCellAdapter(getApplicationContext(), R.id.calendar_day_gridcell, month, year, hmonth, hyear);
            _calendar.set(year, month - 1, _calendar.get(Calendar.DAY_OF_MONTH));
            currentMonth.setText(dateFormatter.format(dateTemplate, _calendar.getTime())  + " | " + getHMonthAsString(hmonth) + " " + hyear);
            adapter.notifyDataSetChanged();
            calendarView.setAdapter(adapter);
        }

    //Hijri Month
    private String getHMonthAsString(int i)
        {
            return hmonths[i];
        }


    @Override
    public void onClick(View v)
        {
            if (v == prevMonth)
                {
                    if (month <= 1)
                        {
                            month = 12;
                            year--;
                        }
                    else
                        {
                            month--;
                        }
                    if (hmonth <= 1)
                    {
                        hmonth = 12;
                        hyear--;
                    }
                    else
                    {
                        hmonth--;
                    }
                    Log.d(tag, "Setting Prev Month in GridCellAdapter: " + "Month: " + month + " Year: " + year);
                    Log.d(tag, "Setting Prev Islamic Month in GridCellAdapter: " + "Month: " + hmonth + " Year: " + hyear);
                    setGridCellAdapterToDate(month, year, hmonth, hyear);
                }
            if (v == nextMonth)
                {
                    if (month > 11)
                        {
                            month = 1;
                            year++;
                        }
                    else
                        {
                            month++;
                        }
                    if (hmonth > 11)
                    {

                        hmonth = 1;
                        hyear++;
                    }
                    else
                    {
                        hmonth++;
                    }
                    Log.d(tag, "Setting Next Month in GridCellAdapter: " + "Month: " + month + " Year: " + year);
                    Log.d(tag, "Setting Next Islamic Month in GridCellAdapter: " + "Month: " + hmonth + " Year: " + hyear);
                    setGridCellAdapterToDate(month, year, hmonth, hyear);

                }

        }

Logcat показывает ошибку в этой строке:

currentMonth.setText(dateFormatter.format(dateTemplate, _calendar.getTime())  + " | " + getHMonthAsString(hmonth) + " " + hyear);

в getHMonthAsString(hmonth) в setGridCellAdapterToDate методе.

Если я заменю getHMonthAsString(hmonth) на hmonth, календарь правильно зацикливает годы и месяцы и работает нормально без ошибок, но тогда он не отображает названия месяцев, а только числа.

Где я ошибаюсь?


person input    schedule 03.07.2012    source источник


Ответы (1)


Массивы отсчитываются от 0. Если месяц равен 12, как вы установили в onClick, вы прошли конец своего массива.

public void onClick(View v) {
    if (v == prevMonth) {
        if (month <= 1) {
            month = 12; // Ouch.

Кроме того, хотя я понимаю, что исходное форматирование в значительной степени зависит от религии, особенно при публикации IMO лучше всего уменьшить вертикальные и горизонтальные пробелы. Два уровня отступов для одного блока кажутся излишними. Код, перевернутый на бок, не является графиком того, насколько он классный ;)


Редакторы: следите за информацией, которую вы добавляете и удаляете.

person Dave Newton    schedule 03.07.2012
comment
Код взят отсюда: w2davids.wordpress.com/android-simple-calendar Это работает для григорианского календаря. У меня проблемы с календарем Хиджры. Если я заменю getHMonthAsString(hmonth) на hmonth, календарь хиджры тоже заработает, но не покажет названия месяцев, а только числа. - person input; 03.07.2012
comment
Код, перевернутый на бок, не является графиком того, насколько он классный ;) ‹- Это график, показывающий, какие разделы, вероятно, больше всего нуждаются в изменении. - person NominSim; 03.07.2012
comment
Спасибо за подсказку о форматировании. Будет иметь в виду. :) - person input; 03.07.2012
comment
А, хорошо, теперь я понимаю проблему. - person input; 03.07.2012
comment
На самом деле я добавлял информацию, например, от 0 до 12, и за это время вы и другие пользователи добавляли и удаляли информацию, поэтому она стала беспорядочной, я просто пытался добавить больше информации, пока была только одна строка. - person MKJParekh; 03.07.2012
comment
Не пытаясь что-либо доказать, поскольку ваше репо говорит / доказывает гораздо больше, я думал, что вы спешите и не вернетесь, поэтому добавил, что, пожалуйста, не возражайте ... поскольку кажется, что вы не возражаете, и поместили эту строку в ответ. - person MKJParekh; 03.07.2012
comment
@MKJParekh, DaveNewton: я откатился назад, потому что подумал, что комментарий к форматированию исходного кода был хорошим советом, и не думал, что его нужно удалять. Затем я добавил обратно то, что добавил MKJParekh после того, как он удалил комментарий по форматированию исходного кода, потому что это тоже показалось полезным. - person NominSim; 03.07.2012