В чем разница между броском и броском? бросает в Java
Опубликовано: 2013-07-23Один объявляет, а другой делает
Есть пять ключевых слов, связанных с обработкой исключений в Java, например , try, catch, finally, throw и throws . Помимо разницы между final, finally и finalize , throws vs throws — один из часто задаваемых вопросов на собеседованиях по Java.
- Ключевое слово throw используется для создания исключения из любого метода или статического блока в Java, в то время как ключевое слово throws , используемое в объявлении метода, обозначает, какое исключение может быть вызвано этим методом. Они не взаимозаменяемы.
- Если какой-либо метод выдает проверенное исключение, как показано в приведенном ниже примере, то вызывающая сторона может либо обработать это исключение, перехватив его, либо может повторно выдать его, объявив другое предложение throws в объявлении метода.
- Предложение Throw можно использовать в любой части кода, где, по вашему мнению, необходимо создать определенное исключение для вызывающего метода.
Понимание исключений Java:
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 |
java . lang . Object | +-- java . lang . Throwable | +-- java . lang . Exception | | | +-- java . lang . ClassNotFoundException | | | +-- java . io . IOException | | | | | +-- java . io . FileNotFoundException | | | +-- java . lang . RuntimeException | | | +-- java . lang . NullPointerException | | | +-- java . lang . IndexOutOfBoundsException | | | +-- java . lang . ArrayIndexOutOfBoundsException | +-- java . lang . Error | +-- java . lang . VirtualMachineError | +-- java . lang . OutOfMemoryError |
Если метод выдает исключение, он должен быть либо окружен блоком try-catch для его перехвата, либо этот метод должен иметь в своей подписи предложение throws. Без предложения throws в подписи компилятор Java JVM не знает, что делать с исключением. Предложение throws сообщает компилятору, что это конкретное исключение будет обрабатываться вызывающим методом.
Ниже приведен очень простой пример, объясняющий поведение блока Throw, Throws, Try, Catch, finally в Java.
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 49 50 51 52 53 54 |
package com . crunchify . tutorials ; import java . io . FileInputStream ; import java . io . FileNotFoundException ; /** * @author Crunchify.com */ public class CrunchifyThrowThrows { @SuppressWarnings ( "unused" ) public static void main ( String args [ ] ) throws Exception { FileInputStream crunchifyStream1 = null ; FileInputStream crunchifyStream2 = null ; String fileName = "Crunchify.txt" ; System . out . println ( "main: Starting " + CrunchifyThrowThrows . class . getName ( ) + " with file name = " + fileName ) ; // get file input stream 1 try { crunchifyStream1 = crunchifyTest1 ( fileName ) ; } catch ( FileNotFoundException ex ) { System . out . println ( "main: Oops, FileNotFoundException caught" ) ; } catch ( Exception ex ) { System . out . println ( "main: Oops, genreal exception caught" ) ; } // get file input stream 2 crunchifyStream2 = crunchifyTest2 ( fileName ) ; System . out . println ( "main: " + CrunchifyThrowThrows . class . getName ( ) + " ended" ) ; } public static FileInputStream crunchifyTest1 ( String fileName ) throws FileNotFoundException { FileInputStream crunchifyStream = new FileInputStream ( fileName ) ; System . out . println ( "crunchifyTest1: File input stream created" ) ; return crunchifyStream ; } public static FileInputStream crunchifyTest2 ( String fileName ) throws Exception { FileInputStream crunchifyStream = null ; try { crunchifyStream = new FileInputStream ( fileName ) ; } catch ( FileNotFoundException ex ) { throw new Exception ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; //System.out.println("crunchifyTest2: Oops, FileNotFoundException caught"); } finally { System . out . println ( "crunchifyTest2: finally block" ) ; } System . out . println ( "crunchifyTest2: Returning from crunchifyTest2" ) ; return crunchifyStream ; } } |
Результат:

1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : finally block Exception in thread "main" java . lang . Exception : crunchifyTest2 : Oops , FileNotFoundException caught at com . crunchify . tutorials . CrunchifyThrowThrows . crunchifyTest2 ( CrunchifyThrowThrows . java : 45 ) at com . crunchify . tutorials . CrunchifyThrowThrows . main ( CrunchifyThrowThrows . java : 30 ) |
Теперь просто замените строки 45 и 46 строкой ниже, чтобы увидеть результат ниже:
1 2 |
//throw new Exception("crunchifyTest2: Oops, FileNotFoundException caught"); System . out . println ( "crunchifyTest2: Oops, FileNotFoundException caught" ) ; |
Новый результат:
1 2 3 4 5 6 |
main : Starting com . crunchify . tutorials . CrunchifyThrowThrows with file name = Crunchify . txt main : Oops , FileNotFoundException caught crunchifyTest2 : Oops , FileNotFoundException caught crunchifyTest2 : finally block crunchifyTest2 : Returning from crunchifyTest2 main : com . crunchify . tutorials . CrunchifyThrowThrows ended |
Список всех руководств по Java, которые могут вас заинтересовать.
Бонусные советы по исключениям:
- Нормальное выполнение программы немедленно разветвляется при возникновении исключения.
- Проверенные исключения должны быть перехвачены или перенаправлены. Это можно сделать с помощью оператора try … catch или путем определения исключения в определении метода.
- Исключение перехватывается первым блоком catch , связанный с которым класс исключения соответствует классу или суперклассу выданного исключения.
- Если в цепочке исключений не найден соответствующий блок catch , поток, содержащий выброшенное исключение, завершается.
- Блок finally после оператора try … catch выполняется независимо от того, перехвачено исключение или нет.
- Возврат в блоке finally разрывает цепочку исключений для вызывающей стороны даже для неперехваченных исключений.