English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 예제를 통해 throw와 throws 키워드를 사용한 예외 처리를 배웁니다.
Java에서 예외는 두 가지 유형으로 나눌 수 있습니다:
확인되지 않은 예외:그들은 컴파일 시에 아니라 실행 시에 확인됩니다. 예를 들어 ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException, Error 클래스 하위의 예외 등.
확인되지 않은 예외:컴파일 시에 그들을 확인하세요. 예를 들어 IOException, InterruptedException 등.
참조Java 예외검사된 및 비검사된 예외를 더 잘 이해하기 위해.
일반적으로 비검사된 예외를 처리할 필요는 없습니다. 이는 프로그래밍 오류로 인해 비검사된 예외가 발생했기 때문입니다. 그리고 이를 수정하는 것이 예외 처리보다 좋은 습관입니다.
이제, throw과 throws를 사용하여 검사된 예외를 처리하는 방법에 대해 중점적으로 설명하겠습니다.
메서드 선언에서 throws 키워드를 사용하여 발생할 수 있는 예외 유형을 선언합니다.
그 문법은 다음과 같습니다:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2 ... { // code }
위의 문법에서 볼 수 있듯이, throws를 사용하여 여러 개의 예외를 선언할 수 있습니다.
import java.io.*; class Main { public static void findFile() throws IOException { //IOException을 일으킬 수 있는 코드 File newFile = new File("test.txt"); FileInputStream stream = new FileInputStream(newFile); } try { try{ System.out.println("try 블록 내의 나머지 코드"); } catch(IOException e){ System.out.println(e); } } }
출력 결과
java.io.FileNotFoundException: test.txt (No such file or directory)
이 프로그램을 실행할 때, test.txt 파일이 존재하지 않으면 FileInputStream은 IOException을 상속한 FileNotFoundException을 푼다.
메서드가 예외를 처리하지 않으면, throws 절에서该方法에서 발생할 수 있는 예외 유형을 지정해야 하며, 이를 통해 호출 스택에서 더 높은层级의 메서드가 처리할 수 있거나 throws 키워드를 사용하여 직접 지정할 수 있습니다.
findFile() 메서드는 IOException을 푼다. main() 메서드는 이 메서드를 호출하여 발생하는 예외를 처리합니다.
이렇게 throws 키워드를 사용하여 여러 개의 예외를 발생시키는 방법을 보여드립니다.
import java.io.*; class Main { public static void findFile() throws NullPointerException, IOException, InvalidClassException { // NullPointerException을 일으킬 수 있는 코드 … … … // IOException을 일으킬 수 있는 코드 … … … // InvalidClassException을 일으킬 수 있는 코드 … … … } try { try{ System.out.println("try 블록 내의 나머지 코드"); }1{ System.out.println(e1.getMessage()); }2{ System.out.println(e2.getMessage()); } } }
여기서 findFile() 메서드는 throws 절에서 NullPointerException, IOException, InvalidClassException를 발생시킬 수 있음을 지정합니다.
주의하십시오. 우리는 NullPointerException을 처리하지 않았습니다. 이는 검사되지 않은 예외이기 때문입니다. throws 절에서 지정하고 처리할 필요는 없습니다.
여러 메서드가 예외를 일으킬 수 있습니다. 각 메서드에 대해 try...catch를 작성하는 것은 지루하며, 코드는 길고 이해하기 어려워집니다.
현재 메서드에서 캡처하고 싶지 않은 예외(처리해야 할 예외)를 이미 확인한 경우 throws도 매우 유용합니다.
throw 키워드는 예외를 명시적으로 발생시키는 데 사용됩니다.
예외가 발생할 때, 프로그램의 실행 흐름은 try 블록에서 catch 블록으로 이동합니다. 우리는 메서드에서 throw 키워드를 사용합니다.
그 문법은 다음과 같습니다:
throw throwableObject;
Throwable 객체는 Throwable 클래스나 Throwable 클래스의 서브 클래스의 인스턴스입니다.
class Main { public static void divideByZero() { throw new ArithmeticException("0으로 나누려고 합니다"); } try { divideByZero(); } }
출력 결과
thread "main"에서 예외 발생 java.lang.ArithmeticException: 0으로 나누려고 합니다 at Main.divideByZero(Main.java:3) at Main.main(Main.java:7) 종료 상태 1
이 예제에서는 ArithmeticException를 명시적으로 발생시킵니다.
주의: ArithmeticException는 검사되지 않은 예외입니다. 일반적으로 검사되지 않은 예외를 처리할 필요는 없습니다.
import java.io.*; class Main { public static void findFile() throws IOException { public static void main(String[] args) { } try { findFile(); System.out.println("try 블록 내의 나머지 코드"); catch (IOException e) { } System.out.println(e.getMessage()); } } }
출력 결과
파일을 찾을 수 없습니다
findFile() 메서드는 생성자에 전달된 메시지를 사용하여 IOException을 푸시합니다.
주의하십시오. 이는 검사 예외이므로 throws 절에서 지정해야 합니다.
findFile() 메서드를 호출하는 메서드는 이 예외를 처리해야하거나 자신이 throws 키워드를 사용하여 지정할 수 있습니다.
우리는 이 예외를 처리하기 위해 main() 메서드에서 처리했습니다. 예외가 발생할 때, 프로그램 실행의 흐름은 try 블록 사이로 이동합니다. 따라서, try 블록 내의 나머지 코드는 건너뜀되고 catch 블록 내의 문장을 실행합니다.