Рубрики
Без рубрики

Вопросы и ответы для интервью с исключениями Java

Обработка исключений в вопросах и ответах на интервью Java. Вопросы для интервью с исключениями Java для опытных и начинающих.

Автор оригинала: Pankaj Kumar.

Java обеспечивает надежный и объектно-ориентированный подход для обработки сценариев исключений, известных как Обработка исключений Java .

Некоторое время назад я написал длинный пост о Обработке исключений в Java и сегодня я перечисляю некоторые важные Вопросы об исключениях Java с ответами , чтобы помочь вам в интервью.

  1. Что такое исключение в Java?
  2. Каковы ключевые слова обработки исключений в Java?
  3. Объясните Иерархию исключений Java?
  4. Каковы важные методы класса исключений Java?
  5. Объясните функцию Java 7 ARM и блок с несколькими перехватами?
  6. В чем разница между проверенными и непроверенными исключениями в Java?
  7. В чем разница между ключевым словом throw и throws в Java?
  8. Как написать пользовательские исключения в Java?
  9. Что такое ошибка OutOfMemoryError в Java?
  10. Каковы различные сценарии, вызывающие “Исключение в главном потоке”?
  11. В чем разница между final, finally и finalize в Java?
  12. Что происходит, когда основной метод создает исключение?
  13. Можем ли мы иметь пустой блок улова?
  14. Предоставьте некоторые рекомендации по Обработке исключений Java?
  15. В чем проблема с приведенными ниже программами и как ее исправить?

1. Что такое исключение в Java?

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

Всякий раз, когда при выполнении инструкции java возникает какая-либо ошибка, создается объект исключения, а затем JRE пытается найти обработчик исключений для обработки исключения. Если найден подходящий обработчик исключений, объект исключения передается коду обработчика для обработки исключения, известного как перехват исключения . Если обработчик не найден, приложение создает исключение в среде выполнения, и JRE завершает программу.

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

2. Каковы ключевые слова обработки исключений в Java?

В обработке исключений Java используются четыре ключевых слова.

  1. бросок : Иногда мы явно хотим создать объект исключения, а затем бросить его, чтобы остановить нормальную обработку программы. Ключевое слово throw используется для создания исключений во время выполнения для его обработки.
  2. throws : Когда мы создаем какое-либо проверенное исключение в методе и не обрабатываем его, нам нужно использовать ключевое слово throws в подписи метода, чтобы сообщить вызывающей программе об исключениях, которые могут быть вызваны методом. Вызывающий метод может обрабатывать эти исключения или распространять их на вызывающий метод, используя ключевое слово throws . Мы можем предоставить несколько исключений в предложении throws, и его также можно использовать с методом main () .
  3. try-catch : Мы используем блок try-catch для обработки исключений в нашем коде. try-это начало блока, а catch-в конце блока try для обработки исключений. У нас может быть несколько блоков catch с попыткой и попыткой-блоки catch также могут быть вложены. блок catch требует параметра, который должен иметь тип Exception.
  4. наконец : Блок finally является необязательным и может использоваться только с блоком try-catch. Поскольку исключение останавливает процесс выполнения, у нас могут быть открыты некоторые ресурсы, которые не будут закрыты, поэтому мы можем использовать блок finally. Блок finally выполняется всегда, независимо от того, возникает исключение или нет.

3. Объясните Иерархию исключений Java?

Исключения Java являются иерархическими, и наследование используется для классификации различных типов исключений. Выбрасываемый является родительским классом иерархии исключений Java и имеет два дочерних объекта – Ошибка и Исключение . Исключения далее делятся на проверенные исключения и исключения во время выполнения.

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

Проверенные исключения – это исключительные сценарии, которые мы можем предвидеть в программе и попытаться восстановить из нее, например, исключение FileNotFoundException. Мы должны поймать это исключение, предоставить полезное сообщение пользователю и правильно зарегистрировать его для целей отладки. Исключение является родительским классом всех проверенных исключений.

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

4. Каковы важные методы класса исключений Java?

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

  1. Строка GetMessage() – Этот метод возвращает строку сообщения Throwable, и сообщение может быть предоставлено при создании исключения через его конструктор.
  2. Строка getLocalizedMessage() – Этот метод предусмотрен для того, чтобы подклассы могли переопределять его для предоставления сообщений, зависящих от языкового стандарта, вызывающей программе. Реализация класса Throwable этого метода просто использует метод GetMessage() для возврата сообщения об исключении.
  3. synchronized Throwable getCause() – Этот метод возвращает причину исключения или значение null, если причина неизвестна.
  4. String toString() – Этот метод возвращает информацию о Throwable в строковом формате, возвращаемая строка содержит имя класса Throwable и локализованное сообщение.
  5. void printStackTrace() – Этот метод выводит информацию о трассировке стека в стандартный поток ошибок, этот метод перегружен, и мы можем передать PrintStream или PrintWriter в качестве аргумента для записи информации о трассировке стека в файл или поток.

5. Объясните функцию Java 7 ARM и блок multi-catch?

Если вы улавливаете много исключений в одном блоке try, вы заметите, что код блока catch выглядит очень некрасиво и в основном состоит из избыточного кода для регистрации ошибки, имея это в виду Java 7.Одной из функций был блок с несколькими перехватами, где мы можем улавливать несколько исключений в одном блоке catch. Блок catch с этой функцией выглядит следующим образом:

catch(IOException | SQLException | Exception ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Большую часть времени мы используем finally block только для закрытия ресурсов, а иногда забываем закрыть их и получаем исключения во время выполнения, когда ресурсы исчерпаны. Эти исключения трудно отлаживать, и нам, возможно, потребуется изучить каждое место, где мы используем этот тип ресурса, чтобы убедиться, что мы его закрываем. Итак, java 7 одним из улучшений стало try-with-resources , где мы можем создать ресурс в самом операторе try и использовать его внутри блока try-catch. Когда выполнение выходит из блока try-catch, среда выполнения автоматически закрывает эти ресурсы. Примером блока try-catch с этим улучшением является:

try (MyResource mr = new MyResource()) {
            System.out.println("MyResource created in try-with-resources");
        } catch (Exception e) {
            e.printStackTrace();
        }

Подробнее об этом читайте в Java 7 ARM .

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

  1. Проверенные исключения должны обрабатываться в коде с помощью блока try-catch, иначе метод должен использовать ключевое слово throws, чтобы сообщить вызывающему абоненту о проверенных исключениях, которые могут быть вызваны из метода. Непроверенные исключения не требуется обрабатывать в программе или упоминать о них в предложении throws метода.
  2. Исключение является суперклассом всех проверенных исключений, тогда как Исключение RuntimeException является суперклассом всех непроверенных исключений. Обратите внимание, что исключение RuntimeException является дочерним классом исключения.
  3. Проверенные исключения-это сценарии ошибок, которые необходимо обработать в коде, иначе вы получите ошибку во время компиляции. Например, если вы используете FileReader для чтения файла, он выдает FileNotFoundException , и мы должны поймать его в блоке try-catch или снова передать вызывающему методу. Непроверенные исключения в основном вызваны плохим программированием, например, исключение NullPointerException при вызове метода по ссылке на объект, не убедившись, что он не равен нулю. Например, я могу написать метод для удаления всех гласных из строки. Ответственность за то, чтобы не передавать пустую строку, лежит на вызывающем абоненте. Я мог бы изменить метод для обработки этих сценариев, но в идеале об этом должен позаботиться вызывающий абонент.

7. В чем разница между ключевым словом throw и throws в Java?

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

8. Как написать пользовательские исключения в Java?

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

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

package com.journaldev.exceptions;

import java.io.IOException;

public class MyException extends IOException {

	private static final long serialVersionUID = 4664456874499611218L;
	
	private String errorCode="Unknown_Exception";
	
	public MyException(String message, String errorCode){
		super(message);
		this.errorCode=errorCode;
	}
	
	public String getErrorCode(){
		return this.errorCode;
	}
	

}

9. Что такое ошибка OutOfMemoryError в Java?

OutOfMemoryError в Java-это подкласс java.lang.VirtualMachineError, и он выбрасывается JVM, когда у него заканчивается память кучи. Мы можем исправить эту ошибку, предоставив больше памяти для запуска java-приложения с помощью опций java.

$>java-программа -Xms1024m -Xmx1024m

10. Каковы различные сценарии, вызывающие “Исключение в главном потоке”?

Некоторые из распространенных сценариев исключений основного потока являются:

  • Исключение в главном потоке java.lang.UnsupportedClassVersionError : Это исключение возникает, когда ваш класс java компилируется из другой версии JDK, и вы пытаетесь запустить его из другой версии java.
  • Исключение в главном потоке java.lang.NoClassDefFoundError : Существует два варианта этого исключения. Первый – это когда вы указываете полное имя класса с расширением .class. Второй сценарий-это когда класс не найден.
  • Исключение в главном потоке java.lang.Nosuchmetoderror: main : Это исключение возникает, когда вы пытаетесь запустить класс, у которого нет метода main.
  • Исключение в потоке “основной” java.lang.ArithmeticException : Всякий раз, когда из основного метода возникает исключение, оно выводит исключение в консоль. В первой части объясняется, что исключение создается из основного метода, во второй части выводится имя класса исключения, а затем после двоеточия выводится сообщение об исключении.

Подробнее об этом читайте в разделе Исключение Java в главном потоке .

11. В чем разница между final, finally и finalize в Java?

final и finally являются ключевыми словами в java, тогда как finalize-это метод.

ключевое слово final может использоваться с переменными класса, чтобы их нельзя было переназначить, с классом, чтобы избежать расширения классами, и с методами, чтобы избежать переопределения подклассами, наконец, ключевое слово используется с блоком try-catch для предоставления инструкций, которые всегда будут выполняться, даже если возникнет какое-либо исключение, обычно, наконец, используется для закрытия ресурсов. метод finalize() выполняется сборщиком мусора до уничтожения объекта, это отличный способ убедиться, что все глобальные ресурсы закрыты.

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

12. Что происходит, когда основной метод создает исключение?

Когда исключение создается методом main (), среда выполнения Java завершает работу программы и выводит сообщение об исключении и трассировку стека в системной консоли.

13. Можем ли мы иметь пустой блок захвата?

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

14. Предоставьте некоторые рекомендации по Обработке исключений Java?

Некоторые из лучших практик, связанных с обработкой исключений Java, являются:

  • Используйте специальные исключения для удобства отладки.
  • Создавайте исключения рано (Быстро) в программе.
  • Перехватывайте исключения в конце программы, пусть вызывающий обработает исключение.
  • Используйте функцию Java 7 ARM, чтобы убедиться, что ресурсы закрыты, или используйте, наконец, блок, чтобы закрыть их должным образом.
  • Всегда регистрируйте сообщения об исключениях в целях отладки.
  • Используйте блок с несколькими защелками для более чистого закрытия.
  • Используйте пользовательские исключения, чтобы создать исключение одного типа из API приложения.
  • Следуйте соглашению об именовании, всегда заканчивайтесь исключением.
  • Документируйте исключения, создаваемые методом, использующим @throws в javadoc.
  • Исключения обходятся дорого, поэтому бросайте их только тогда, когда это имеет смысл. В противном случае вы можете поймать их и предоставить пустой или пустой ответ.

Подробнее о них читайте в разделе “Рекомендации по обработке исключений Java”.

15. В чем проблема с приведенными ниже программами и как ее устранить?

В этом разделе мы рассмотрим некоторые вопросы программирования, связанные с исключениями java.

  1. В чем проблема с приведенной ниже программой?

    Вышеуказанная программа не будет компилироваться, и вы получите сообщение об ошибке “Исключение FileNotFoundException уже поймано альтернативным исключением IOException”. Это связано с тем, что исключение FileNotFoundException является подклассом исключения IOException, существует два способа решения этой проблемы.

    Первый способ – использовать один блок catch для обоих исключений.

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

    Вы можете выбрать любой из этих подходов, основываясь на своем коде блока catch.

  2. В чем проблема с приведенной ниже программой?

    Программа не будет компилироваться, потому что исключение FileNotFoundException является подклассом исключения IOException, поэтому блок catch исключения FileNotFoundException недоступен, и вы получите сообщение об ошибке “Недоступный блок catch для исключения FileNotFoundException. Это уже обрабатывается блоком catch для исключения IOException”.

    Вам необходимо исправить блокировку catch, чтобы решить эту проблему.

    Обратите внимание, что исключение JAXBException не связано с исключением IOException или исключением FileNotFoundException и может быть помещено в любое место в вышеприведенной иерархии блоков catch.

  3. В чем проблема с приведенной ниже программой?

    Программа не будет компилироваться, потому что исключение JAXBException является проверяемым исключением, и метод foo() должен выдавать это исключение для перехвата в вызывающем методе. Вы получите сообщение об ошибке как “Недоступный блок перехвата для исключения jaxbex. Это исключение никогда не выбрасывается из тела инструкции try”.

    Чтобы решить эту проблему, вам придется удалить блок catch исключения JAXBException.

    Обратите внимание, что перехват исключения NullPointerException допустим, потому что это непроверенное исключение.

  4. В чем проблема с приведенной ниже программой?

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

    Аналогично, если метод (foo) объявляет непроверенное исключение в предложении throws, обработка этого в программе не является обязательной.

  5. В чем проблема с приведенной ниже программой?

    Приведенная выше программа не будет компилироваться, потому что сигнатура метода start() не совпадает в подклассе. Чтобы устранить эту проблему, мы можем либо изменить тип метода в подклассе, чтобы он был точно таким же, как в суперклассе, либо мы можем удалить предложение throws из метода подкласса, как показано ниже.

  6. В чем проблема с приведенной ниже программой?

    Вышеприведенная программа не будет компилироваться, потому что объект исключения в блоке multi-catch является окончательным, и мы не можем изменить его значение. Вы получите ошибку времени компиляции как “Параметр e блока с несколькими перехватами не может быть назначен”.

    Мы должны удалить присвоение “e” новому объекту исключения, чтобы устранить эту ошибку.

    Подробнее читайте в Java 7 multi-catch block .

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