Лучшее понимание Checked Vs. Непроверенные исключения — как лучше обрабатывать исключения в Java?
Опубликовано: 2014-09-15проверенное исключение
Что такое проверенное исключение в языке программирования Java. Простым языком: исключение, которое проверяется во время компиляции, называется Checked Exception. Некоторые из них упомянуты ниже. Если в вашем коде какой-то из методов выдает checked exception
, тогда метод должен либо handle the exception
, либо указать исключение с помощью ключевого слова throws
.
- IOException
- SQLException
- Исключение доступа к данным
- Класснотфаундексцептион
- InvocationTargetException
- MalformedURLException
Давайте рассмотрим пример:
В приведенном ниже примере мы собираемся получить содержимое сайта «Crunchify.com» и распечатать его в консоли. Во время этой операции программа Java выдаст MalformedURLException
или IOException
в выделенных ниже строках.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } in . close ( ) ; return sb . toString ( ) ; } } |
Есть два способа решить эту проблему. Add throws clause
ИЛИ Add Try, Catch block
в свой код, чтобы решить эту проблему. Вот обновленный код.
- Измените строки 16 и 20 и
throws IOException
- Добавить блок try catch на 26,42,43
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) throws IOException { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) throws IOException { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; try { URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } } catch ( IOException e ) { // TODO: Consume and Throw an error with detailed message. } in . close ( ) ; return sb . toString ( ) ; } } |

Непроверенное исключение
Непроверенное исключение в Java — это те исключения, обработка которых NOT verified during Compile time
. Эти исключения возникают из-за плохого программирования.
Программа не выдаст ошибку компиляции.
Все исключения Unchecked являются прямыми подклассами класса RuntimeException
.
Simple Example
: вы создали онлайн-форму, которая принимает пользовательский ввод. Это свободная текстовая форма. Пользователь может ввести любое неправильное значение в случае поля электронной почты, поля имени пользователя ИЛИ поля номера телефона.
Если у вас нет проверки на стороне клиента, есть больше возможностей получить исключение проверки во время выполнения при запуске приложения в рабочей среде. Ошибка может возникать при работе с БД или конвертации поля из одного формата в другой.
Ниже приведены типы непроверенных исключений:
- Исключение нулевого указателя
- ArrayIndexOutOfBound
- IllegalArgumentException
- Илегалстатеексцептион
Меня больше всего раздражает исключение NullPointer Exception. На прошлой неделе я написал подробную статью о NPE.
Всего есть 8 различных советов, чтобы избежать NPE.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; try { String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } catch ( ArrayIndexOutOfBoundsException e ) { System . out . println ( "ArrayIndexOutOfBoundException appears here. Better handle it in code above :)" + e ) ; } } } |
В Java 7 вы могли обрабатывать несколько исключений в одном Catch block
. Вы можете изменить строку 13 из верхней строки, измененную на нижнюю.
1 |
} catch ( ArrayIndexOutOfBoundsException | NumberFormatException e ) { |
Подводя итог, оба исключения Checked и Unchecked Exception обрабатываются с использованием ключевых слов try, catch
и finally
.
С точки зрения функциональности Checked и Unchecked Exception одинаковы.