Рекламное объявление
Как начинающий программист Как научиться программированию без стрессаВозможно, вы решили заняться программированием, будь то для карьеры или просто как хобби. Большой! Но, может быть, вы начинаете чувствовать себя разбитым. Не так здорово Вот помощь, чтобы облегчить ваше путешествие. Подробнее , Концепция чего-либо Обработка исключений может быть трудно обернуть голову вокруг. Не то чтобы сама концепция была сложной, но терминология может сделать ее более продвинутой, чем она есть. И это настолько мощная функция, что она склонна злоупотреблять и злоупотреблять.
В этой статье вы узнаете, что такое исключения, почему они важны, как их использовать и какие ошибки следует избегать. Самые современные языки 6 самых простых языков программирования для начинающихОбучение программированию - это поиск правильного языка так же, как и процесс назидания. Вот шесть самых простых языков программирования для начинающих. Подробнее иметь некоторую обработку исключений, так что если вы
когда-либо переходить с Java 7 полезных приемов для освоения нового языка программированияЭто нормально, когда вы учитесь кодировать. Вы, вероятно, забудете вещи так же быстро, как выучите их. Эти советы помогут вам лучше сохранить всю эту новую информацию. Подробнее Вы можете взять большинство из этих советов с собой.Понимание исключений Java
В Java исключение является объектом, который указывает на что-то ненормальное (или «исключительное»), произошедшее во время выполнения вашего приложения. Такие исключения выброшены, что в основном означает создание объекта исключения (аналогично тому, как «вызываются» ошибки).
Прелесть в том, что ты можешь улов генерируемые исключения, которые позволяют вам справиться с ненормальным состоянием и позволить вашему приложению продолжать работать, как будто ничего не пошло не так. Например, в то время как нулевой указатель в C может привести к сбою приложения, Java позволяет бросать и ловить Исключение нулевого указателя
s перед тем, как нулевая переменная может вызвать сбой.
Помните, что исключение - это просто объект, но с одной важной характеристикой: оно должно быть расширено от исключение
класс или любой подкласс исключение
. Хотя в Java есть все виды встроенных исключений, вы также можете создавать свои собственные, если хотите. Некоторые из наиболее распространенные исключения Java включают:
Исключение нулевого указателя
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Так что же происходит, когда вы бросаете исключение?
Во-первых, Java просматривает непосредственный метод, чтобы увидеть, есть ли код, который обрабатывает исключение, которое вы бросили. Если обработчик не существует, он смотрит на метод, который вызвал текущий метод, чтобы увидеть, существует ли там дескриптор. Если нет, то он смотрит на метод, который вызвал это метод, а затем следующий метод и т. д. Если исключение не обнаружено, приложение печатает трассировку стека, а затем вылетает. (На самом деле это больше нюанс, чем просто сбой, но это сложная тема, выходящая за рамки этой статьи.)
трассировки стека список всех методов, которые Java обошла при поиске обработчика исключений Вот как выглядит трассировка стека:
Исключение в теме "основной" java.lang. NullPointerException в com.example.myproject. Book.getTitle (Book.java: 16) на com.example.myproject. Author.getBookTitles (Author.java: 25) на com.example.myproject. Bootstrap.main (Bootstrap.java: 14)
Мы можем многое почерпнуть из этого. Во-первых, исключение было Исключение нулевого указателя
. Это произошло в GetTitle ()
метод в строке 16 Book.java. Этот метод был вызван из getBookTitles ()
на линии 25 Author.java. Это метод был вызван из основной()
на линии 14 Bootstrap.java. Как видите, знание всего этого облегчает отладку.
Но опять же, истинное преимущество исключений состоит в том, что вы можете «обрабатывать» ненормальное состояние, перехватывая исключение, исправляя ситуацию и возобновляя приложение без сбоев.
Использование исключений Java в коде
Допустим, у вас есть SomeMethod ()
это берет целое число и выполняет некоторую логику, которая может сломаться, если целое число меньше 0 или больше 100. Это может быть хорошим местом для исключения:
public void someMethod (int value) {if (value <0 || value> 100) {throw new IllegalArgumentException
(); } //... }
Чтобы поймать это исключение, вам нужно пойти туда, где SomeMethod ()
называется и использовать блок try-catch:
public void callMethod () {try {someMethod (200); someOtherMethod (); } catch (IllegalArgumentException e) {// обработать исключение здесь} //... }
Все в пределах пытаться Блок будет выполняться по порядку, пока не будет сгенерировано исключение. Как только возникает исключение, все последующие операторы пропускаются, и логика приложения немедленно переходит к улов блок.
В нашем примере мы входим в блок try и сразу же вызываем SomeMethod ()
. Поскольку 200 не между 0 и 100, IllegalArgumentException
брошен Это сразу заканчивается исполнением SomeMethod ()
, пропускает остальную часть логики в блоке try (someOtherMethod ()
никогда не вызывается) и возобновляет выполнение в блоке catch.
Что будет, если мы позвоним SomeMethod (50)
вместо? IllegalArgumentException
никогда не будет брошен. SomeMethod ()
будет исполняться как обычно. Блок try будет выполняться как обычно, вызывая someOtherMethod ()
когда someMethod () завершается. когда someOtherMethod ()
заканчивается, блок захвата будет пропущен и callingMethod ()
будет продолжаться
Обратите внимание, что вы можете иметь несколько блоков catch для каждого блока try:
public void callMethod () {try {someMethod (200); someOtherMethod (); } catch (IllegalArgumentException e) {// обработать исключение здесь} catch (NullPointerException e) {// обработать исключение здесь} //... }
Также обратите внимание, что дополнительный Ну наконец то Блок также существует:
public void method () {try {//... } catch (Exception e) {//... } Ну наконец то { //... } }
Код в блоке finally всегда выполнено несмотря ни на что. Если у вас есть оператор return в блоке try, блок finally выполняется перед возвратом из метода. Если вы выбросите еще одно исключение в блоке catch, блок finally выполняется до того, как будет сгенерировано исключение.
Вы должны использовать блок finally, когда у вас есть объекты, которые необходимо очистить до завершения метода. Например, если вы открыли файл в блоке try, а затем сгенерировали исключение, блок finally позволяет закрыть файл перед выходом из метода.
Обратите внимание, что вы можете иметь блок finally без блока catch:
public void method () {try {//... } Ну наконец то { //... } }
Это позволяет вам выполнить любую необходимую очистку, позволяя распространенным исключениям распространяться вверх по методу. стек вызовов (т. е. вы не хотите обрабатывать исключение здесь, но вам все равно нужно очистить первый).
Проверено против Непроверенные исключения в Java
В отличие от большинства языков, Java различает проверенные исключения и непроверенные исключения (например, C # имеет только непроверенные исключения). Проверенное исключение должен быть пойманным в методе, где генерируется исключение, иначе код не будет компилироваться.
Чтобы создать проверенное исключение, расширьте от исключение
. Чтобы создать непроверенное исключение, расширьте от RuntimeException
.
Любой метод, который выдает проверенное исключение, должен обозначать это в сигнатуре метода, используя бросает ключевое слово. Так как Java встроенный IOException
является проверенным исключением, следующий код не будет компилироваться:
public void wontCompile () {//... if (someCondition) {throw new IOException (); } //... }
Сначала вы должны объявить, что он выдает проверенное исключение:
public void willCompile () выбрасывает IOException {//... if (someCondition) {throw new IOException (); } //... }
Обратите внимание, что метод может быть объявлен как выбрасывающий исключение, но никогда не генерирует исключение. Тем не менее, исключение все равно нужно будет перехватить, иначе код не будет скомпилирован.
Когда следует использовать проверенные или непроверенные исключения?
Официальная документация Java имеет страница по этому вопросу. Он суммирует разницу с кратким практическим правилом: «Если разумно ожидать, что клиент восстановится после исключения, сделайте его проверенным исключением. Если клиент не может ничего сделать для восстановления после исключения, сделайте его непроверенным исключением ».
Но это руководство может быть устаревшим. С одной стороны, проверенные исключения делают результат в более надежном коде 10 советов по написанию более чистого и качественного кодаНаписание чистого кода выглядит проще, чем есть на самом деле, но преимущества того стоят. Вот как вы можете начать писать более чистый код сегодня. Подробнее . С другой стороны, ни один другой язык не проверял исключения так же, как Java, что показывает две вещи: Во-первых, эта функция не достаточно полезна для других языков, чтобы ее украсть, а во-вторых, вы можете абсолютно без их. Кроме того, проверенные исключения не очень хорошо работают с лямбда-выражениями, представленными в Java 8.
Рекомендации по использованию исключений Java
Исключения полезны, но легко злоупотребляют и злоупотребляют. Вот несколько советов и рекомендаций, которые помогут вам избежать путаницы.
-
Предпочитаю конкретные исключения общим исключениям. использование
NumberFormatException
надIllegalArgumentException
когда это возможно, в противном случае используйтеIllegalArgumentException
надRuntimeException
когда возможно. -
Никогда не лови
Throwable
!исключение
класс на самом деле расширяетсяThrowable
и блок catch на самом деле работает сThrowable
или любой класс, который расширяет Throwable. Тем не менееошибка
класс также расширяетсяThrowable
, и вы никогда не хотите пойматьошибка
потому чтоошибка
s указывают на серьезные неисправимые проблемы. -
Никогда не лови
исключение
!InterruptedException
продолжаетсяисключение
так что любой блок, который ловитисключение
также будет ловитьInterruptedException
и это очень важное исключение, с которым вы не хотите связываться (особенно в многопоточных приложениях), если не знаете, что делаете. Если вы не знаете, какое исключение нужно ловить, постарайтесь ничего не ловить. -
Используйте описательные сообщения для облегчения отладки. Когда вы бросаете исключение, вы можете предоставить
строка
сообщение в качестве аргумента. К этому сообщению можно получить доступ в блоке catch, используяException.getMessage ()
метод, но если исключение никогда не перехватывается, сообщение также будет отображаться как часть трассировки стека. -
Старайтесь не ловить и игнорировать исключения. Чтобы обойти неудобство проверенных исключений, многие новички и ленивые программисты установят блок catch, но оставят его пустым. Плохо! Всегда обрабатывайте это изящно, но если вы не можете, по крайней мере распечатайте трассировку стека, чтобы вы знали, что было сгенерировано исключение. Вы можете сделать это с помощью
Exception.printStackTrace ()
метод. - Остерегайтесь чрезмерного исключения. Когда у вас есть молоток, все выглядит как гвоздь. Когда вы впервые узнаете об исключениях, вы можете почувствовать себя обязанным превратить все в исключение… до такой степени, что большая часть потока управления вашего приложения сводится к обработке исключений. Помните, исключения предназначены для «исключительных» случаев!
Теперь вы должны быть достаточно удобны с исключениями, чтобы понять, что они собой представляют, почему они используются и как включить их в свой собственный код. Если вы не до конца понимаете концепцию, это нормально! Мне потребовалось некоторое время, чтобы это «щелкнуло» в моей голове, поэтому не нужно торопиться 6 признаков того, что вы не должны быть программистомНе каждый хочет быть программистом. Если вы не совсем уверены, что должны быть программистом, вот некоторые признаки, которые могут указать вам верное направление. Подробнее . Не торопитесь.
Есть вопросы? Знаете какие-либо другие советы, связанные с исключениями, которые я пропустил? Поделитесь ими в комментариях ниже!
Джоэл Ли имеет степень бакалавра в области компьютерных наук и более шести лет профессионального опыта написания. Он главный редактор MakeUseOf.