Exceptions and Localization Flashcards
Locale создание/получение
1) Есть констуктор для языка + язык и страна, + язык страна и комментарий (передавать аргументы можно в любом кейсе en или EN - конструктор выправит кейс автоматом )
2) Locale.Builder с методами setRegion, setLanguage
3) Locale.getDefault() возвращает дефолтную- можно сменить через setDefault(Locale)
4) Есть ряд предсозданных константных локалей Locale.GERMAN например
NumberFormat получение
Создается фабричными методами:
1) getInstance(OVERLOAD Locale) или getNumberInstance(OVERLOAD Locale) возвращает форматтер для чисел
2)getCurrencyInstance(OVERLOAD Locale) форматтер для валют
3)getPercentInstance(OVERLOAD Locale) форматер для процентов
4)getIntegerInstance(OVERLOAD Locale) форматтер, который округляет дробное число перед форматированием.
Методы форматтера:
1)String format(Number ) форматирует число в строковое представление согласно астроек локаля в форматтере
2)Number parse(String) парсит строку в число согласно настроек локаля в форматтере. Парсит до первого не соответствующего маске символа. Если первый же символ не соответствует маске, то только тогда выкидывает checked ParseException).
DecimalFormat
Класс наследующий от NumberFormat, используемый для форматирования внешнего вида вещественного числа.
В конструктор передается паттерн, где
# обозначает цифру, которой если нету, то можно проигнорировать.
0- обозначает цифру, которую нужно дополнить нулями при отсутствии.
, а другими символами можно обозначать вид форматирования.
Метод String format(source) возвращает отформатированную строку.
ПРи это дробная часть обрезается по количеству символов справа
Например: 456 будет отображаться так
C $###.## будет $456
С 0000.00 будет 0456.00
DateTimeFormatter локализация
Имеет статические методы ofLocalizedTime/Date/DateTime(константный FormatStyle) возвращающий годную к использованию форму DateTimeFormattera (FormatStyle.LONG и FormatStyle. FULL используютсят только с определением LocalZone) FormatStyle.SHORT и FormatStyle.MEDIUM используются универсально со всеми объектами времени. В локализованную версию перед форматом можно вызвать метод withLocale(Locale) который выводит данные в локаль специфическом формате.
Установка дефолтной локали частично
Есть перегруженная версия setDefault которая позволяет частично установить локаль только для дисплэя или для формата setDefault(Locale.Category.DISPLAY || FORMAT, Locale) (по дефолту устанавливает в оба)
ResourceBundle и property файлы
Может использовать разные источники данных- один из них property файл с парами ключа значение- разделенными = или :
В названии Property файла паттерн- имя + локаль + .properties
ResourceBundle.getBundle(bundleName, Optional Locale (default if empty)) -позволяет получить нужный бандл
Из него можно получить значения через getString(key) или getObject(key) и через keySet() вернуть список всех ключей
Ключ- всегда строка, а вот значение в зависимости от имплементации может различаться.
Поиск ключа в ResourceBundle
Процесс поиска ключа можно разбить на два этапа с разной поисковой логикой.
Сперва ищется наиболее подходящий ResourceBundle:
Ищется бандл с полным соответствием локали
С языком локали
Ищется бандл с полным соответствием дефолтной локали
С языком дефолтной локали
Дефолтный безлокальный бандл
Если бандл не находится то MissingResourceException
Далее в бандле ищется ключ:
Ищется ключ в возвращенном бандле
Затем в его родителе (то есть для fr_CA ищется в fr)
Затем в дефолтном безлокальном бандле
Если ключ не находится то MissingResourceException
Форматирование плэйсхолдеров в i18n Значениях
Можно указывать нумерованные места вставки в значении, например hello = Hello, {1}. После возврата значения по ключу, эту строку можно форматировать с использованием MessageFormat.format(String mask,String…argsToInsert).
Если значение для плэйсхолдера не предоставлена то плэйсхолдер вернтся как есть со скобками.
Properties класс
Класс отвечающий за сохранение, загрузку данных из специльного файла .properties. Он не работает и не зависит от локаля, поэтому загружает конкретно с указанным проперти файлом. Наследует от HashTable поэтому имеет обычные методы коллекций но также имеет свои методы:
1)load(inputStream | Reader | ) загружает данные из файла (properties? но расширение также может быть txt и другое- главное тип хранения данных) представленного стримом
2)loadFromXml(InputStream) - загружает свойства из xml файла
3) Set setPropertyNames() возвращает сет значений параметров, значение каждого из которых можно вернуть методом String getProperty(String propertyKey, ).
!!!Есть перегруженная версия getProperty с дефолтным значением
5)устанаваливаются новые параметры методом setProperty(String,String) !!! get/setProperty нужно использовать вместо put/get наследованных от мапы
Properties класс
ласс отвечающий за сохранение, загрузку данных из специльного файла .properties. Он не работает и не зависит от локаля, поэтому загружает конкретно с указанным проперти файлом. Наследует от HashTable поэтому имеет обычные методы коллекций но также имеет свои методы:
1) load(inputStream | Reader | ) загружает данные из файла (properties? но расширение также может быть txt и другое- главное тип хранения данных) представленного стримом
2) loadFromXml(InputStream) - загружает свойства из xml файла
3) значение каждого из параметров можно вернуть методом String getProperty(String propertyKey, OVERLOAD String deafultvalue).
5) устанаваливаются новые параметры методом setProperty(String,String) !!! get/setProperty нужно использовать вместо put()/get() так как put/get более ошибкоемки из за того что разрешают работать с объектами
Unchecked и checked исключения- иерархия
Исключения бывают обязательные для обработки (все наследники класса Exception кроме RuntimeException + сам Throwable), и необязательные (исключения класса RunTimeException, и ошибки класса Error). Ошибки не имеет смысла обрабатывать, т.к. программными методами их не решить.
Представители Error
ExceptionInInitializerError - ошибка, которую вызывает исключение возникшее при статической инициализации (в статическом инициализаторе или при инициализации статической переменной). Она в виде ошибке так как исключение вызвало то, что не загрузился целый класс.
StackOverflowError- переполнение размера стэка методов- чаще всего в результате продолжительной или бесконечной рекурсии.
NoClassDefFoundError - происходит когда при компиляции класс был доступен а при runtime уже нет.
OutOfMemoryError - исчерпание памяти, бывает четырех видов: JavaHeap space, PermGen space, GC overhead limit exceeded, unable to create new native thread.
Представители RuntimeException
ArithmeticException (ошибка деления на ноль)
ArrayIndexOutOfBoundsException (ошибка выхода индекса за величину массива).
IllegalArgumentException
NumberFormatException - потомок IllegalArgumentException , происходит например при парсе String в int если в строке отсутствуют числа.
IllegalStateExecption и UnsupportedOperationException - рантайм исключения при работе с потоками и коллекциями.
ArrayStoreException - возникает при неверном типе объекта помещенном в массив, который привели к более широкому типу.
DateTimeEception- ошибка при парсе строки в дату.
MissingResourceException- попытка доступа к bundle файлу, которго нет или к ключу которого нет
ClassCastException
NullPointerException
NumberFormatException IllegalStateExecption и UnsupportedOperationException ArrayStoreException DateTimeEception MissingResourceException
потомок IllegalArgumentException , происходит например при парсе String в int если в строке отсутствуют числа.
рантайм исключения при работе с потоками и коллекциями.
возникает при неверном типе объекта помещенном в массив, который привели к более широкому типу.
ошибка при парсе строки в дату.
попытка доступа к bundle файлу, которго нет или к ключу которого нет
Представители Checked исключений
- Все исключения из пакета IO - FileNotFoundException,NotSerializableException, предки IOException;
- Все иключения из пакета sql(SQLException);
- ParseException (из пакета text- при парсе строки в число)