- •Лабораторная работа № 4 Работа с исключениями и коллекциями
- •Исключения в Java. Теоретические сведения
- •Использование try, catch и throw
- •Использование множественного catch и finally
- •Использование ключевого слова throws
- •Системные исключения
- •UnsupportedOperationException - обнаружена неподдерживаемая операция Коллекции (перечислимые типы) в Java. Теоретические сведения.
- •Иерархия интерфейсов коллекций
- •Назначение интерфейсов, расширяющих интерфейс Collection
- •Рабочие классы интерфейса List
- •Массив типа ArrayList
- •Методы класса ArrayList
- •Массив типа LinkedList
- •Методы класса LinkedList
- •Ассоциативные массивы в Java
- •Диаграмма интерфейса Map
- •Рабочие классы интерфейса Map
- •Задание
- •Приложение 1. Работа с датой и временем в Java
- •Приложение 2. Пример общего класса обработки ошибок, сообщений и логирования.
Приложение 1. Работа с датой и временем в Java
Работа с датой и временем достаточно трудоемка по сравнению с числовыми типами данных. В месяцах разное количество дней, которое зависит еще и от года. Месяцы и дни недели имеют разные названия, поэтому языкозависимы. Разнообразие форматов записи даты гораздо большее, чем у чисел. Поэтому реализация работы с датой в Java естественным образом реализована с помощью объектов. Удобная работа с датой и временем в составе пакета java.time появилась в Java SE 8.
API java.time содержит 5 пакетов:
java.time — базовый пакет, содержащий объекты для хранения значений
java.time.chrono — предоставляет доступ к разным календарям
java.time.format — форматирование и распознание даты и времени
java.time.temporal — низкоуровневые библиотеки и расширенный функционал
java.time.zone — классы для работы с часовыми поясами
Пример. Вывод текущего времени
import java.time.*; ...
LocalTime time = LocalTime.now(); System.out.println(time.getHour()+":"+time.getMinute()+":"+time.getSecond()); // 18:29:3 System.out.println(time.format(DateTimeFormatter.ofPattern("H:mm:ss"))); // 18:29:03 // Использование форматирования |
Пример. Манипуляции с датой: получение текущей, создание новой, проверки
LocalDate today = LocalDate.now(); LocalDate ntoday = today.plusDays(20);
if( today.isBefore(ntoday) ) { Period period = today.until(ntoday); System.out.println("Дней между today и ntoday : "+period.getDays()); // 20 }
//Получаем год, проверям его на высокосность System.out.println(today.getYear()+" - высокосный? "+today.isLeapYear()); // TRUE |
Помимо нового пакета java.time можно пользоваться и устаревшим пакетом java.util.Date.
Для получения значения миллисекунд и наносекунд можно использовать:
System.currentTimeMillis()
System.nanoTime()
Приложение 2. Пример общего класса обработки ошибок, сообщений и логирования.
В приложении удобно централизовать обработку ошибочных сообщений. Для этого можно, например, создать специальный класс в пакете контроллера, а затем создать его объект и передать в объект контроллера. В этом специальном классе можно создать объект стандартного логгера Java и использовать его для записи данных в лог-файл. Для удобства настройки лог-параметров файла их целесообразно вынести в конфигурационный файл лога – logging.prоperties
Пример класса ErrMsgLog
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.FileHandler;
import java.util.logging.SimpleFormatter;
/**
*
* @author Андрей
*/
public class ErrMsgLog {
private static ArrayList <Exception> ErrList;
private static Logger log;
//private static FileHandler errhnd;
public ErrMsgLog() throws IOException {
ErrList = new ArrayList();
//Читаем конфигурационный файл лога
LogManager.getLogManager().readConfiguration(ErrMsgLog.class.getResourceAsStream("logging.properties"));
log = Logger.getLogger(ErrMsgLog.class.getName());
//Закомментарили т.к. вынесли в конфигурационный файл лога
//errhnd = new FileHandler("src/logs/err_log.txt", true);
//errhnd.setFormatter( new SimpleFormatter());
//log.addHandler(errhnd);
}
//Добавляем ошибку в список ошибок
public int addErr(Exception e) {
ErrList.add(e);
return ErrList.size();
}
//Добавляем ошибку в список ошибок и в лог
public int addErrWithLog(Exception e) {
ErrList.add(e);
//Код записи сообщения в лог
log.log(Level.FINE, e.getMessage());
return ErrList.size();
}
//Получаем количество ошибок
public int getErrCount() {
return ErrList.size();
}
//Выводим информацию об ошибке
public void showErrText(Exception e) {
System.err.println(e.getMessage());
}
//Генерим (пробрасываем ошибку) с фиксацией в списке ошибок
public Exception makeErr(Exception e) {
addErr(e);
return new Exception(e);
}
}
Пример конф. файла logging.properties, лежащего в одном пакете с ErrMsgLog
.level=FINE
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
handlers = java.util.logging.FileHandler
#Путь к папке и файлу запсиси лога. При нескольких файлах имя будет иметь вид err_log.txt.n, где n - число
java.util.logging.FileHandler.pattern = src/logs/err_log.txt
#количество байт в файле лога
java.util.logging.FileHandler.limit = 100000
#количество файлов лога
java.util.logging.FileHandler.count = 3
#дописываем в конец файла лога ошибки
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
#Настраиваем формат вывода
#format 0, date 1, source 2, logger 3, level 4, message 5, thrown 6);
#%1$tF %1 - взять дату из строки, $ - применить форматир-е, t - время, F - дата в формате ISO8601: YYYY-MM-DD
java.util.logging.SimpleFormatter.format = %1$tF %1$tT %4$-5s %5$s %n
Полный список настроек логера, которые можно использовать в logging.properties можно посмотреть по адресу — http://tutorials.jenkov.com/java-logging/configuration.html.
Список опций форматирования можно посмотреть по адресу - http://pr0java.blogspot.com/2015/06/8.html.
Далее в классе с которого стартует прогграмма создаем объект нашего общего обработчика
myerr = new ErrMsgLog();
Передаем его в контроллер
controller = new Main(model, view, prop, myerr);
И далее можно ошибки обрабатывать с помощью этого класса.
Пример. Обработка ошибки.
try{
//Какой-то код
} catch (Exception e) {
myerr.addErrWithLog(e); //Добавляем ошибку в список и пишем в лог без отображения в консоли
myerr.showErrText(e); //Отображаем ошибку
}
Пример. Проброс ошибки на вышестоящий уровень с фиксацией в списке ошибок
//В каком-то классе внутри иерархии
try{
//Какой-то код
} catch (NumberFormatException e) {
//Ошибка будет добавлена в список ошибок и затем «поднята» выше по иерархии
throw myerr.makeErr(new Exception("Введен неверный номер пункта меню"));
}
