Почему не обрабатывает исключение ArrayIndexOutOfBoundsException? Java

187
04 января 2022, 07:00

Создан метод, с помощью которого устанавливаются часы. Имеется обрабатываемое исключение ArrayIndexOutOfBoundsException. Но почему, при вводе значения set_value = 33, исключение не обрабатывается (часов ведь максимум 24)?

Ссылка на описание: https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#set-int-int-

public void setHours(int set_value) throws ArrayIndexOutOfBoundsException {
    try {
        objCalendar.set(Calendar.HOUR_OF_DAY, set_value);
        getMessageTime();
    } catch (ArrayIndexOutOfBoundsException a) {
        getMessageErrorRangeOfValues();
        objCalendar.set(Calendar.HOUR_OF_DAY, 0);
    }
}

UPD:

Оказывается, исключение бросается, если объект класса Calendar установлен в режим `non-lenient'.

Оригинальная цитата:

Leniency

Calendar has two modes for interpreting the calendar fields, lenient and non-lenient. When a Calendar is in lenient mode, it accepts a wider range of calendar field values than it produces. When a Calendar recomputes calendar field values for return by get(), all of the calendar fields are normalized. For example, a lenient GregorianCalendar interprets MONTH == JANUARY, DAY_OF_MONTH == 32 as February 1.

When a Calendar is in non-lenient mode, it throws an exception if there is any inconsistency in its calendar fields. For example, a GregorianCalendar always produces DAY_OF_MONTH values between 1 and the length of the month. A non-lenient GregorianCalendar throws an exception upon calculating its time or calendar field values if any out-of-range field value has been set. `

Решение:

Установить режим non-lenient' с помощью методаsetLenient()вот такobj.setLenient(false);. По умолчанию режим ставится какtrue`.

Тогда код выглядит так:

public void setHours(int set_value) throws ArrayIndexOutOfBoundsException {
    try {
        objCalendar.set(Calendar.HOUR_OF_DAY, set_value);
        getMessageTime();
    } catch (ArrayIndexOutOfBoundsException a) {
        getMessageErrorRangeOfValues();
        objCalendar.set(Calendar.HOUR_OF_DAY, 0);
    }
}

Но после установки режима в false начинает выбрасывать другое исключение - IllegalArgumentException. Хорошо, попытаемся обработать и это исключение. Тогда код будет выглядеть следующим образом:

public void setHours(int set_value) throws ArrayIndexOutOfBoundsException, IllegalArgumentException {
    try {
        objCalendar.set(Calendar.HOUR_OF_DAY, set_value);
        getMessageTime();
    } catch (IllegalArgumentException i) {
        getMessageErrorRangeOfValues();
        objCalendar.set(Calendar.HOUR_OF_DAY, 0);
    }
}

Но вот незадача. Опять выбрасывает исключение Exception in thread "Thread-0" java.lang.IllegalArgumentException:.

Ответ: разбираюсь на данный момент

Answer 1

Дочитывайте документацию:

objCalendar.setLenient(false);
READ ALSO
Как интегрировать приложение с поиском в android tv?

Как интегрировать приложение с поиском в android tv?

Не нашел документации на русском языке, а по официальной документации не могу разобраться https://developerandroid

152
Не ясна логика Collections.sort()

Не ясна логика Collections.sort()

В список заношу стринги, сортируюsort()-ом ожидаю увидеть прорядок но не вижу его

174
Выделяемая память для Java

Выделяемая память для Java

Передаю в JVM command line parameters:

191
Смена цвета фона основного окна

Смена цвета фона основного окна

Создал небольшую форму пробную, есть задание сменить цвет фонаВсе вроде бы просто

209