던지기와 던지기의 차이점은 무엇입니까? 자바에서 던진다
게시 됨: 2013-07-23하나는 선언하고 다른 하나는 수행
Java의 예외 처리와 관련된 다섯 가지 키워드(예: try, catch, finally, throw 및 throws)가 있습니다. final, finally 및 finalize 의 차이점 외에도 throw 대 throw는 자주 묻는 Java 인터뷰 질문 중 하나입니다.
- throw 키워드 는 Java의 모든 메서드 또는 정적 블록에서 예외를 throw하는 데 사용되는 반면 throws 키워드 는 메서드 선언에 사용되며 이 메서드에서 어떤 예외를 throw할 수 있는지 표시합니다. 그것들은 교환할 수 없습니다.
- 아래 예제와 같이 메서드가 확인된 예외를 throw하는 경우 호출자는 이 예외를 catch하여 처리하거나 메서드 선언에서 다른 throws 절을 선언하여 다시 throw할 수 있습니다.
- throw 절은 호출 메서드에 특정 예외를 throw해야 한다고 생각되는 코드의 모든 부분에서 사용할 수 있습니다.
과소평가된 자바 예외:
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 |
메서드가 예외를 throw하는 경우 catch 블록으로 둘러싸거나 해당 메서드의 서명에 throw 절이 있어야 합니다. 서명에 throw 절이 없으면 Java JVM 컴파일러는 예외를 처리할 방법을 모릅니다. throws 절은 이 특정 예외가 호출 메서드에 의해 처리될 것임을 컴파일러에 알립니다.
다음은 Java에서 Throw, Throws, Try, Catch, finally 블록의 동작을 설명하는 매우 간단한 예입니다.
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 문에서 수행하거나 메서드 정의에서 예외를 정의하여 수행할 수 있습니다.
- 예외는 연관된 예외 클래스가 throw된 예외의 클래스 또는 수퍼클래스와 일치하는 첫 번째 catch 블록에 의해 catch됩니다.
- 예외 체인에 일치하는 catch 블록이 없으면 throw된 예외를 포함하는 스레드가 종료됩니다.
- try ... catch 문 이후의 finally 블록은 예외의 catch 여부에 관계없이 실행됩니다.
- finally 블록 내에서 반환하면 포착되지 않은 예외의 경우에도 호출자에 대한 예외 체인이 끊어집니다.