시작하며
여러분 안녕하세요!
DreamHanks의 254cm입니다.
이번에는 예외 처리에 대해서 설명해드리겠습니다.
Java의 전체 기사는 여기를 클릭해 주세요.
이전 기사는 [ Java 개발 ] 제 18 회 인터페이스에 대해서 배워봤습니다.
예외와 오류 (Exceptions and errors)
프로그램 작동 도중 예기치 못한 사태가 발생하여, 실행 중인 프로그램의 영향을 받는 것에는 에러(error)와 예외(exception) 두 가지가 있습니다.
〇 에러 (error)
에러는 JVM에서 발생하는 문제로 프로그램에서 제어할 수 없는 문제를 의미합니다.
예를 들어서 Stack 메모리에 오버플로우가 발생할 수 있습니다.
〇 예외(exception)
예외는 에러와 비슷한 것입니다만, 프로그램에서 예외 발생에 대응하는 것이 다릅니다.
대표적인 것이 지정된 경로에 파일이 존재하지 않을 때 발생하는 FileIOException이 있습니다.
try/catch/finally
java에서는 예외 처리를 위해 try/catch/finally 문을 제공하고 있습니다.
1.try
try/catch/finally 문에서 가장 먼저 실행됩니다. try문의 소스코드에서 발생한 예외는 catch 블록으로 대응합니다.
2. catch
try블록에서 발생한 예외가 인수로 전달되어 그 예외를 대응합니다.
3. finally
finally 블록은 예외발생 여부와 관계없이 반드시 수행됩니다.
※catch 블록과 finally 블록은 필수가 아닙니다.하지만 try 단독으로 사용할 수는 없습니다.
try / catch / finally를 쓰는 법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
try { 예외 처리를 하고 싶은 소스코드 } catch (e1) { e1 예외가 발생할 경우 실행되는 소스 코드 } catch (e2) { e2 예외가 발생할 경우 실행되는 소스 코드 } ... finally { 예외발생 여부와 관계없이 실행되는 소스코드 } |
위의 소스 코드의 e1과 e2는 예외 클래스의 인스턴스입니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 |
public class ExceptionSample { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader(new File("C:\\test.txt"))); } catch (FileNotFoundException e) { System.out.println("file이 발견되지 않습니다."); } } } |
위의 샘플은 try에서 Buffered Reader클래스에서 파일의 내용을 읽고 있습니다.
그리고 지정한 경로로 파일이 없을 경우 catch가 실행되도록 적혀 있습니다.
catch의 괄호에서는 대응하고 싶은 예외 클래스의 인스턴스를 작성합니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ExceptionSample { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader(new File("C:\\test.txt"))); } catch (FileNotFoundException e) { System.out.println("file을 찾을 수 없습니다."); } //catchは重複使用ができます。 catch (Exception e) { System.out.println("예외가 발생했습니다."); } finally { System.out.println("try/catch/finally종료"); } } } |
위의 샘플을 보면 두 개의 catch가 사용되고 있습니다.
위의 try/catch/finally는 File Not Found Exception 클래스로 예외 대응이 불가능한 경우
Exception 클래스로 대응하도록 작성되었습니다.
다양한 예외가 발생할 수 있는 소스 코드를 예외 처리할 때
위의 샘플과 같이 catch를 복수 사용해 여러 가지 예외를 대응할 수 있습니다.
※여러 개를 사용할 수 있는 것은 catch 밖에 없습니다.
샘플 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class ExceptionSample { public static void main(String[] args) { try { System.out.println("try 실행"); } finally { System.out.println("finally 실행"); } try { System.out.println("try 실행"); } catch (Exception e) { System.out.println("예외 발생"); } } } |
위와 같이 catch 또는 finally를 적절히 조합하여 사용할 수도 있습니다.
그러나 try를 단독으로 사용할 수는 없고 try없이 catch/finally만을 사용할 수도 없습니다.
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 |
public class ExceptionSample { public static void main(String[] args) { try { try { System.out.println("실행 1"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("실행 2"); } catch (NullPointerException e2){ System.out.println("실행 3"); } } catch (Exception e) { System.out.println("실행 4"); } finally { System.out.println("실행 5"); } } } |
1. try블록의 소스 코드가 실행됩니다.이때 예외가 발생하지 않고 finally블록이 있을 경우 finally블록이 실행됩니다.
2. try 블록에서 예외가 발생하면 catch 핸들러는 다음과 같은 순서로 적절한 catch 블록을 찾습니다.
2.1 stack으로 try 블록과 가장 가까운 catch 블록부터 검사합니다.
2.2 적절한 catch 블록을 찾지 못한 경우 바깥쪽 catch 블록을 검사합니다.
2.3 그래도 적절한 catch 블록을 찾지 못하면 예외를 처리할 수 없습니다.
3. 적절한 catch를 찾았을 경우 예외 객체가 인수로 catch에게 전달됩니다.
4. 모든 예외처리가 끝나면 finally가 실행됩니다.
5. finally의 소스 코드가 종료되면 try/catch/finally가 종료됩니다.
끝으로
이번 기사는 이상이 됩니다.
다음 시간에는 Exception 클래스를 배워보겠습니다.
시청해 주셔서 감사합니다.
コメント