Вопросы по java exception

Содержание
  1. Вопросы об интервью с Java-исключениями (ответы)
  2. 2. Вопросы
  3. Q1. Что такое исключение?
  4. Q2. Какова цель ключевых слов «бросок» и «бросок»?
  5. Q3. Как можно справиться с исключением?
  6. Q4. Как поймать множественные исключения?
  7. Q5. В чем разница между отмеченным и непроверенным исключением?
  8. Q6. В чем разница между исключением и ошибкой?
  9. Q7. Какое исключение будет выдано при выполнении следующего блока кода?
  10. Q8. Что такое цепочка исключений?
  11. Q9. Что такое трассировка стека и как она связана с исключением?
  12. Q10. Почему вы хотите создать подкласс исключения?
  13. Q11. Каковы преимущества исключений?
  14. Q12. Можете ли вы создать какое-либо исключение в теле лямбда-выражения?
  15. Q13. Какие правила нам нужно соблюдать при переопределении метода, вызывающего исключение?
  16. Топ 10 вопросов об исключениях в Java
  17. 1. Проверяемые и непроверяемые
  18. 2. Лучший способ работать с исключениями
  19. 3. Почему переменные, определенные в try не могут быть использованы в catch или finally?
  20. 4. Почему Double.parseDouble(null) и Integer.parseInt(null) вызывают разные исключения?
  21. 5. Основные runtime exceptions в Java
  22. 6. Можно ли поймать несколько исключений в одном блоке catch?
  23. 7. Может ли конструктор вызывать исключения?
  24. 8. Вызов исключений в блоке final
  25. 9. Можно ли использовать return в блоке finally
  26. 10. Почему разработчики обрабатывают исключения втихую?

Вопросы об интервью с Java-исключениями (ответы)

Исключения являются важной темой, с которой каждый Java-разработчик должен быть знаком. Эта статья содержит ответы на некоторые вопросы, которые могут возникнуть во время интервью.

2. Вопросы

Q1. Что такое исключение?

Исключением является ненормальное событие, которое происходит во время выполнения программы и нарушает нормальный поток инструкций программы.

Q2. Какова цель ключевых слов «бросок» и «бросок»?

Ключевое словоthrows используется для указания того, что метод может вызывать исключение во время своего выполнения. Он обеспечивает явную обработку исключений при вызове метода:

public void simpleMethod() throws Exception < // . >

Ключевое словоthrow позволяет нам генерировать объект исключения, чтобы прервать нормальный поток программы. Это чаще всего используется, когда программа не удовлетворяет заданному условию:

Читайте также:  Python to lua converter

Q3. Как можно справиться с исключением?

try < // . >catch (ExceptionType1 ex) < // . >catch (ExceptionType2 ex) < // . >finally < // . >

Блок кода, в котором может возникнуть исключение, заключен в блокtry. Этот блок также называется «защищенным» или «защищенным» кодом.

Если возникает исключение, выполняется блокcatch, соответствующий генерируемому исключению, в противном случае все блокиcatch игнорируются.

Блокfinally всегда выполняется после выхода из блокаtry, независимо от того, было ли в нем сгенерировано исключение или нет.

Q4. Как поймать множественные исключения?

Есть три способа обработки нескольких исключений в блоке кода.

Первый — использовать блокcatch, который может обрабатывать все генерируемые типы исключений:

Следует помнить, что рекомендуется использовать обработчики исключений, которые являются максимально точными.

Слишком широкие обработчики исключений могут сделать ваш код более подверженным ошибкам, улавливать непредвиденные исключения и вызывать неожиданное поведение в вашей программе.

Второй способ — реализовать несколько блоков catch:

try < // . >catch (FileNotFoundException ex) < // . >catch (EOFException ex) < // . >

Обратите внимание, что, если исключения имеют отношения наследования; дочерний тип должен идти первым, а родительский тип позже. Если мы этого не сделаем, это приведет к ошибке компиляции.

Третий — использовать блок multi-catch:

try < // . >catch (FileNotFoundException | EOFException ex) < // . >

Эта функция впервые появилась в Java 7; уменьшает дублирование кода и облегчает обслуживание.

Q5. В чем разница между отмеченным и непроверенным исключением?

Проверенное исключение должно обрабатываться в блокеtry-catch или объявлено в предложенииthrows; тогда как непроверенное исключение не требуется обрабатывать или объявлять.

Проверенные и непроверенные исключения также называются исключениями времени компиляции и выполнения соответственно.

Все исключения являются отмеченными исключениями, за исключением обозначенныхError,RuntimeException и их подклассов.

Q6. В чем разница между исключением и ошибкой?

Исключением является событие, которое представляет собой условие, из которого возможно восстановление, в то время как ошибка представляет внешнюю ситуацию, из которой обычно невозможно восстановить.

Все ошибки, выдаваемые JVM, являются экземплярамиError или одного из его подклассов, наиболее распространенные из них включают, но не ограничиваются:

  • OutOfMemoryError — выбрасывается, когда JVM не может выделить больше объектов, потому что не хватает памяти, и сборщик мусора не может сделать больше доступных
  • StackOverflowError — возникает, когда пространство стека для потока исчерпано, обычно из-за слишком глубокой рекурсии приложения.
  • ExceptionInInitializerError — сигнализирует, что во время оценки статического инициализатора произошло непредвиденное исключение
  • NoClassDefFoundError — выдается, когда загрузчик классов пытается загрузить определение класса и не может его найти, обычно потому, что требуемые файлыclass не были найдены в пути к классам
  • UnsupportedClassVersionError — возникает, когда JVM пытается прочитать файлclass и определяет, что версия в файле не поддерживается, обычно потому, что файл был создан с помощью более новой версии Java

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

Q7. Какое исключение будет выдано при выполнении следующего блока кода?

Integer[][] ints = < < 1, 2, 3 >, < null >, < 7, 8, 9 >>; System.out.println("value paragraph"> 

Он выдаетArrayIndexOutOfBoundsException, поскольку мы пытаемся получить доступ к позиции, превышающей длину массива.

Q8. Что такое цепочка исключений?

Происходит, когда исключение выдается в ответ на другое исключение. Это позволяет нам открыть полную историю нашей поднятой проблемы:

try < task.readConfigFile(); >catch (FileNotFoundException ex)

Q9. Что такое трассировка стека и как она связана с исключением?

Трассировка стека предоставляет имена классов и методов, которые были вызваны, с момента запуска приложения до момента возникновения исключения.

Это очень полезный инструмент отладки, поскольку он позволяет нам точно определить, где в приложении возникло исключение, и исходные причины, которые к нему привели.

Q10. Почему вы хотите создать подкласс исключения?

Если тип исключения не представлен теми, которые уже существуют на платформе Java, или если вам нужно предоставить дополнительную информацию клиентскому коду, чтобы обработать его более точным образом, вам следует создать собственное исключение.

Решение о том, следует ли включать или отключать пользовательское исключение, полностью зависит от бизнес-ситуации. Однако, как правило; если можно ожидать, что код, использующий ваше исключение, восстановится после него, создайте проверенное исключение, в противном случае сделайте его неконтролируемым.

Кроме того, вы должны унаследовать от наиболее конкретного подклассаException, который тесно связан с тем, который вы хотите выбросить. Если такого класса нет, выберитеException в качестве родительского.

Q11. Каковы преимущества исключений?

Традиционные методы обнаружения и обработки ошибок часто приводят к тому, что спагетти-код трудно поддерживать и трудно читать. Однако исключения позволяют нам отделить основную логику нашего приложения от деталей того, что делать, когда происходит что-то неожиданное.

Кроме того, поскольку JVM осуществляет поиск в стеке вызовов в обратном направлении, чтобы найти любые методы, заинтересованные в обработке конкретного исключения; мы получаем возможность распространять ошибки в стеке вызовов без написания дополнительного кода.

Кроме того, поскольку все исключения, генерируемые в программе, являются объектами, они могут быть сгруппированы или распределены по категориям на основе иерархии классов. Это позволяет нам перехватывать групповые исключения в одном обработчике исключений, указав суперкласс исключения в блокеcatch.

Q12. Можете ли вы создать какое-либо исключение в теле лямбда-выражения?

При использовании стандартного функционального интерфейса, уже предоставленного Java, вы можете генерировать только непроверенные исключения, потому что стандартные функциональные интерфейсы не содержат предложение throws в сигнатурах методов:

List integers = Arrays.asList(3, 9, 7, 0, 10, 20); integers.forEach(i -> < if (i == 0) < throw new IllegalArgumentException("Zero not allowed"); >System.out.println(Math.PI / i); >);

Однако, если вы используете пользовательский функциональный интерфейс, возможно создание проверенных исключений:

@FunctionalInterface public static interface CheckedFunction

public void processTasks( List taks, CheckedFunction checkedFunction) < for (Task task : taks) < try < checkedFunction.apply(task); >catch (Exception e) < // . >> > processTasks(taskList, t -> < // . throw new Exception("Something happened"); >);

Q13. Какие правила нам нужно соблюдать при переопределении метода, вызывающего исключение?

Несколько правил определяют, как исключения должны объявляться в контексте наследования.

Когда метод родительского класса не генерирует никаких исключений, метод дочернего класса не может генерировать какое-либо проверенное исключение, но может генерировать любое непроверенное.

Вот пример кода, чтобы продемонстрировать это:

class Parent < void doSomething() < // . >> class Child extends Parent < void doSomething() throws IllegalArgumentException < // . >>

Следующий пример не удастся скомпилировать, так как переопределяющий метод генерирует проверенное исключение, не объявленное в переопределенном методе:

class Parent < void doSomething() < // . >> class Child extends Parent < void doSomething() throws IOException < // Compilation error >>

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

Вот пример кода, который успешно следует предыдущему правилу:

class Parent < void doSomething() throws IOException, ParseException < // . >void doSomethingElse() throws IOException < // . >> class Child extends Parent < void doSomething() throws IOException < // . >void doSomethingElse() throws FileNotFoundException, EOFException < // . >>

Обратите внимание, что оба метода соблюдают правило. Первый генерирует меньше исключений, чем переопределенный метод, а второй, даже если генерирует больше; они уже по объему.

Однако, если мы попытаемся сгенерировать проверенное исключение, которое не объявляет метод родительского класса, или выбросим исключение с более широкой областью действия; мы получим ошибку компиляции:

class Parent < void doSomething() throws FileNotFoundException < // . >> class Child extends Parent < void doSomething() throws IOException < // Compilation error >>

Когда у метода родительского класса есть предложение throws с неконтролируемым исключением, метод дочернего класса может сгенерировать ни одно или любое количество неконтролируемых исключений, даже если они не связаны между собой.

Вот пример, который соблюдает это правило:

class Parent < void doSomething() throws IllegalArgumentException < // . >> class Child extends Parent < void doSomething() throws ArithmeticException, BufferOverflowException < // . >>

Источник

Топ 10 вопросов об исключениях в Java

Java-университет

Топ 10 вопросов об исключениях в Java - 1

Статья описывает 10 наиболее часто задаваемых вопросов об исключениях в Java.

1. Проверяемые и непроверяемые

В кратце, проверяемые исключения должны быть явно пойманы в теле метода или объявлены в секции throws метода. Непроверяемые исключения вызваны проблемами, которые не могут быть решены, такими как деление на 0, нулевой указатель и т.п. Проверяемые исключения особенно важны потому, что от других разработчиков, использующих ваше API, вы ожидаете, что они будут знать, как обращаться с исключениями. Например, IOException - часто используемое проверяемое исключение, а RuntimeException - непроверяемое. Перед тем, как читать дальше, ознакомьтесь с Иерархической диаграммой исключений в Java.

2. Лучший способ работать с исключениями

Если исключение может быть правильно обработано, его надо ловить, иначе, оно должно быть проброшено дальше.

3. Почему переменные, определенные в try не могут быть использованы в catch или finally?

В следующем куске кода строку s, объявленную в блоке try, нельзя использовать в блоке catch. Этот код не скомпилируется.

 try < File file = new File("path"); FileInputStream fis = new FileInputStream(file); String s = "inside"; >catch (FileNotFoundException e)

Причина в том, что неизвестно, где именно в блоке try могло быть вызвано исключение. Вполне возможно, что исключение было вызвано до того, как был объявлен объект. И именно для данного примера это справедливо.

4. Почему Double.parseDouble(null) и Integer.parseInt(null) вызывают разные исключения?

Так и есть, они действительно вызывают разные исключения. Это проблема JDK. Они просто были разработаны разными людьми, и не стоит всерьёз заморачиваться над этим.

 Integer.parseInt(null); // вызывает java.lang.NumberFormatException: null Double.parseDouble(null); // вызывает java.lang.NullPointerException 

5. Основные runtime exceptions в Java

 IllegalArgumentException ArrayIndexOutOfBoundsException 

6. Можно ли поймать несколько исключений в одном блоке catch?

Ответ - ДА. Пока классы этих исключений можно отследить вверх по иерархии наследования классов до одного и того же суперкласса, можно использовать только этот суперкласс.

7. Может ли конструктор вызывать исключения?

8. Вызов исключений в блоке final

 public static void main(String[] args) < File file1 = new File("path1"); File file2 = new File("path2"); try < FileInputStream fis = new FileInputStream(file1); >catch (FileNotFoundException e) < e.printStackTrace(); >finally < try < FileInputStream fis = new FileInputStream(file2); >catch (FileNotFoundException e) < e.printStackTrace(); >> > 

Но чтобы сохранить читабельность кода, надо объявить вложенный блок try-catch как новый метод, и вставить вызов этого метода в блок finally .

 public static void main(String[] args) < File file1 = new File("path1"); File file2 = new File("path2"); try < FileInputStream fis = new FileInputStream(file1); >catch (FileNotFoundException e) < e.printStackTrace(); >finally < methodThrowException(); >> 

9. Можно ли использовать return в блоке finally

10. Почему разработчики обрабатывают исключения втихую?

Часто встречаются например такие куски кода. Если правильная обработка исключений так важна, почему разработчики продолжают так писать?

Источник

Оцените статью