Подготовка к ревью на junior java dev. Книга Уорбэртон Функциональное программирование в массы java8
Скачать 483.96 Kb.
|
Ревью: Обработка ошибок, исключения, отладка 4х видео про исключения от Алишева на ютубе (https://www.youtube.com/watch?v=DElNhj71YCk&t=96s), Источник на javastudy(ответы на половину вопросов) - https://javastudy.ru/interview/exceptions/ Смотреть только тему исключений - https://jsehelper.blogspot.com/2016/01/java-core-3.html Статья Головача на тему исключений - https://habr.com/ru/company/golovachcourses/blog/225585/ Видео по теме исключений: https://www.youtube.com/watch?v=ZspkReG8L2E&ab_channel=Followthewhiterabbit https://www.youtube.com/watch?v=KLAf5EEdZ-s https://www.youtube.com/watch?v=mLpMtc62530&ab_channel=%D0%A3%D1%80%D0%BE%D0%BA%D0%B8Java https://www.youtube.com/watch?v=edlQcZpxfwo&ab_channel=%D0%93%D0%BE%D1%88%D0%B0%D0%94%D1%83%D0%B4%D0%B0%D1%80%D1%8C https://www.youtube.com/watch?v=e1Balqbin84&ab_channel=%D0%A3%D1%80%D0%BE%D0%BA%D0%B8Java https://www.youtube.com/watch?v=LzwZT7Yko04&ab_channel=%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BCJava https://www.youtube.com/watch?v=N4fmELeXw5I&ab_channel=%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BCJava https://www.youtube.com/watch?v=mLpMtc62530&ab_channel=%D0%A3%D1%80%D0%BE%D0%BA%D0%B8Java https://www.youtube.com/watch?v=KLAf5EEdZ-s&ab_channel=Followthewhiterabbit https://habr.com/ru/company/golovachcourses/blog/225585/ Список вопросов, которые спрашивают на ревью: Иерархия исключений? – Object – Throwable – Exception/Error – Exception (IOException/RunTimeException) Чем отличаются исключения от обычных классов? - Классы-ошибки, расширяющие класс Error, свидетельствуют о возникновении сложных ситуаций в виртуальной машине Java. ... Имена классов-ошибок, по соглашению, заканчиваются словом Error. Классы-исключения, расширяющие класс Exception, отмечают возникновение обычной нештатной ситуации, которую можно и даже нужно обработать. Все ключевые слова и всё что с ними связано? – Try/Catch/Fynally/Throw/throws Всё исключения и как генерировать различные виды исключений? – throw new (); Как создать, выбросить, поймать свое исключение? – создать свой класс и наследоваться от Exception/RunTimeException в зависимости от того, какую ошибку нужно обработать. Где возможно вызывать исключения? – в классе, методе, в любом блоке try-catch-finally Конструкция try-finally? - В конструкции Try-Finally, инструкция Finally гарантированно выполнится, абсолютно независимо оттого, что произойдет в предложении Try. Однако, предложение Finally фактически не обрабатывает никаких исключений Можно ли обрабатывать разные исключения в одном блоке catch? – можно через знак | (прямая черта) Обязателен ли блок finally? А catch? Когда будет выполнен finally? – конструкция может быть как try/catch так и try/finally (т.е. без catch или finally, но что-то одно обязательно должно быть). Finally будет выполнен всегда, за исключением редких случаев. Когда не будет выполнен finally(4 случая)? – Если упала JVM, Бесконеччный цикл в JVM (в блоке try/catch). Была вызвана команда System.exit, Еесли это поток демон, все не-демон потоки завершились, то он завершится до finally Будет ли выполнен finally при Error? – да, при ошибке типа Error блок finally также будет выполнен Разница try catch и if Какой return вернется? Из try или finally? – если оператор return написан и в try и в finally, то выполнится return в finally Что если в конструкции try finally вылетело исключение сначала в try а потом в finally? Какое исключение вылетит? Что будет с другим? – в случае если исключение вылетело и в try и в finally, то вылетит то, исключение, которое случилось в finally (как и с оператором return). Другое исключение оно просто «проглотит», если не было блока catch. Расскажи про информацию, которая находится внутри исключения? Как с ней работать? – Исключение содержит в себе stacktrace(стектрейс вызовов), т.е. последовательность вызванных функций, а также номер строки, на которой возникла ошибка. Что возвращает getStackTrace()? – возвращает массив StackTraceElement[] в котором содержатся элементы трассировки стека Какое правило должно соблюдаться при использовании нескольких блоков catch (с одним try)? – от меньшего к большему. Первыми должны ловиться наименьшие в иерархии исключения. Иначе будут «недостижимые» исключения, которые никогда не будут выполнены программой. Какое правило должно соблюдаться при попытке поймать несколько исключений в одном catch? – если мы ловим несколько исключений, одно из которых является родителем другого, то мы должны оставить только родителя, иначе компилятор будет ругаться. Исключения прописываются через разделитель |. Переменная объекта ex (Exception ex) является final Зачем создавать свой класс и наследовать его от Exception? – для создания СОБСТВЕННЫХ проверяемых исключительных ситуаций, которые не предусмотрены JVM или компилятором и последующей обработки этих ситуаций Что такое ошибка, а что такое исключительная ситуация? – исключительная ситуация – ситуация которую мы можем предсказать и обработать. Ошибка возникает на уровне JVM и не может быть обработана программистом (закончилась память в компьютере или переполнен стек – и взять её неоткуда, поэтому и обрабатывать смысла нет) Что нужно делать программисту, если в коде происходит деление на ноль? – это ошибка кода, которую программист должен убрать. Или убрать деление на 0 или добавить проверочное условие. От каких классов Throwable и его подклассов нельзя наследоваться? – технически от класса Error наследоваться не принято, т.к. это ошибки JVM (серьезные ошибки, которые программист итак обработать не может) Какую информацию можно получить из StackTraceElement? – актуальную. информация о текущем состоянии «стека вызовов функций» Когда одна функция вызывает другую, Java-машина помещает в этот стек новый элемент StackTraceElement. Когда функция завершается этот элемент удаляется из стека. Можно ли так написать try { throw new Object(); }? – это будет ошибкой, т.к. Object не является исключением, хотя и является родителем Throwable. Вся работа с исключениями начинается с класса Throwable В чём разница между проверяемыми исключениями и непроверяемыми? В чём разница с точки зрения синтаксиса и идеологическая при использовании? – checked(проверяемые исключение) мы должны или обработать с помощью try/catch или пробросить дальше добавлением в сигнатуру throws. Непроверямые ни обрабатывать ни делать что-либо ещё не нужно. Можно ловить и checked и unchecked, но ловить unchecked не нужно. Обрабатывать нужно только checked исключения. Unchecked исключения RunTimeException это больше ошибка кода (программиста), которую нужно исправить Какое назначение класса Throwable? - Класс Throwable есть базовым для всех стандартных классов исключений Java. Этот класс предоставляет ряд методов, которые можно использовать или переопределять в собственных классах обработки исключений. Эти классы должны быть унаследованы от класса Exception, который унаследован от класса Throwable Методы класса Throwable? – getCause() getMessage() addSuppressed() getSuppressed() printStackTrace() Что происходит если не обработать исключение? - Если не было предпринято дополнительных действий, то поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System Что такое подавленные исключения? - Подавленные исключения -это дополнительные исключения, которые возникают в операторе try-with-resources ( введенном в Java 7 ) при закрытии ресурсов AutoCloseable. Поскольку при закрытии ресурсов AutoCloseable может возникнуть несколько исключений, дополнительные исключения присоединяются к основному исключению как подавленные исключения . Как достать подавленное исключение? - Вы можете получить подавленные исключения, вызвав метод Throwable.getSuppressed(Throwable e) из исключения, созданного блоком try. Что такое ресурс в конструкции try-with-resources? - любой объект, класс которого реализует интерфейс java.lang.AutoCloseable или java.io.Closable. Что если исключение вылетело сначала в try, а потом в close в конструкции try-with-recources? Какое исключение вылетит? Что будет с другим? - Если исключение будет выброшено в основном коде и в методе close(), то приоритетнее будет первое исключение, а второе исключение будет подавлено, но информация о нем сохранится (с помощью метода Throwable.addSuppressed(Throwable exception), который вызывается неявно Java компилятором Когда происходит закрытие ресурса в конструкции try-with-resources если в try возникло исключение: до перехода в catch или после того как catch отработает? – сначала вызывается метод close(), а потом уже обрабатывает исключение (catch); Какие есть уровни логирования и для чего они нужны? – Уровни логирования – это степень серьезности наших сообщений SEVERE (ошибка-ужас-ужас) - юбая ошибка / исключение, которое является или может быть критическим WARNING (предупреждение) - любое сообщение, которое может предупредить нас о потенциальных проблемах, например когда пользователь пытался войти в систему с неправильными учетными данными - что может указывать на атаку, если это происходит часто или в короткие периоды времени INFO (информационное сообщение) – о нормальном ходе исполнения программы CONFIG – логгирование конфигурационных параметров FINE – совсем детальное логгирование о действиях программы FINER – совсем детальное логгирование о действиях программы FINEST – совсем детальное логгирование о действиях программы В логгере есть ещё Форматтер (Formatter), Хэндлер (Handler), setLevel. Метод log() или все методы с названием уровней логгирования: (метод warning(), info(), config() и т.д.), getLogger(); Логгирование позволяет ответить на вопросы, что происходило, когда и при каких обстоятельствах. Без логов сложно понять, из-за чего появляется ошибка, если она возникает периодически и только при определенных условиях Обязательно ли передавать в метод getLogger() имя класса? Почему так принято? - Это один из используемых контрактов (соглашений) в языке программирования. На каждый класс создаётся только один логгер. Логгеры выстраиваются в иерархию соответственно именам У каждого класса есть своё индивидуальное имя и можно задавать настройки логгирования вплоть до класса. Причины, по которой многие люди используют тип класса: Прост в использовании. Вам не нужно беспокоиться о дублировании имен Легко проверить класс ведения журнала, так как имя журнала будет отображаться в файле журнала Когда вы распространяете свой класс, люди могут захотеть перенаправить ведение журнала из вашего класса в конкретный файл или в другое место Сообщения каких уровней мы увидим, задав уровень INFO? – все, что выше INFO – Info/ Warning, Severe Как Java понимает какой уровень главнее при установке .setLevel(). – по наименьшему уровню приоритета. Чем более свободней левел, тем больший приоритет для него. Какую информацию можно получить из StackTraceElement? У элемента тип StackTraceElement есть следующие методы и как следствие можно получить следующие данные: getClassName() получить имя класса getFileName() получить имя файла getLineNumber() получить номер строки getMethodName() получить имя метода hashCode() возвращает хэшкод объекта isNativeMethod() toString() возвращает строковое представление объекта Чем отличается close от autoclosable? в autoclosable не throws IOException, а расширен до Exception. Ревью: Ввод-вывод, доступ к файловой системе Какие существуют виды потоков ввода/вывода? - Разделяют два вида потоков ввода/вывода: байтовые и символьные. Система ввода/вывода: http://developer.alexanderklimov.ru/android/java/io.php Назовите основные предки потоков ввода/вывода - Байтовые: java.io.InputStream, java.io.OutputStream; Символьные: java.io.Reader, java.io.Writer; Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer? – Базовый класс InputStream представляет классы, которые получают данные из различных источников:- массив байтов- строка (String)- файл- канал (pipe): данные помещаются с одного конца и извлекаются с другого- последовательность различных потоков, которые можно объединить в одном потоке- другие источники (например, подключение к интернету). Класс OutputStream - это абстрактный класс, определяющий потоковый байтовый вывод. В этой категории находятся классы, определяющие, куда направляются ваши данные: в массив байтов (но не напрямую в String; предполагается что вы сможете создать их из массива байтов), в файл или канал. Символьные потоки имеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode. Класс Reader - абстрактный класс, определяющий символьный потоковый ввод. Класс Writer - абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException. Что вы знаете о RandomAccessFile? - Класс RandomAccessFile наследуется напрямую от Object и не наследуется от вышеприведенных базовых классов ввода\вывода. Предназначен для работы с файлами, поддерживая произвольный доступ к их содержимому. Работа с классом RandomAccessFile напоминает использование совмещенных в одном классе потоков DataInputStream и DataOutputStream (они реализуют те же интерфейсы DataInput и DataOutput). Кроме того, метод seek() позволяет переместиться к определенной позиции и изменить хранящееся там значение. При использовании RandomAccessFile необходимо знать структуру файла. Класс RandomAccessFile содержит методы для чтения и записи примитивов и строк UTF-8. Какие есть режимы доступа к файлу? - RandomAccessFile может открываться в режиме чтения ("r") или чтения/записи ("rw"). Также есть режим "rws", когда файл открывается для операций чтения-записи и каждое изменение данных файла немедленно записывается на физическое устройство. |