20201117_TIL
by Haebin Seo
오늘 한 일
- java 공부
- 예외 처리
-
오류
컴파일 오류(compile error): 프로그램 코드 작성 중 발생하는 문법적 오류
실행 오류(runtime error): 실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류실행 오류 시 비정상 종료는 서비스 운영에 치명적이다. 오류가 발생할 수 있는 경우에 로그(log)를 남겨 추후 이를 분석하여 원인을 찾아야 한다. 자바는 예외 처리를 통해 프로그램의 비정상 종료를 막고 log를 남길 수 있다.
-
오류와 예외 클래스
시스템 오류(error): 자바 가상 머신에서 발생. 프로그래머가 처리할 수 없음.
ex) 동적 메모리 없는 경우, 스택 오버 플로우 등예외(exception): 프로그램에서 제어할 수 있는 오류.
ex) 읽어들이려는 파일이 존재하지 않는 경우, 네트워크 연결이 끊어진 경우-
예외 클래스의 종류
모든 예외 클랫스의 최상위 클래스는 Exception이다.
다양한 예외 클래스가 제공된다. - try-catch-finally 문
finally는 try가 수행되면 catch 내의 코드와 관계없이 무조건 실행된다. 따라서 catch 내에서 return; 코드가 작성되어 있더라도 finally 내부의 코드가 실행된다.int[] arr = { 1, 2, 3, 4, 5 }; try { for (int i = 0; i <= 5; i++) { System.out.println(arr[i]); } } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e); return; } finally { System.out.println("finally"); } // 1 // 2 // 3 // 4 // 5 // java.lang.ArrayIndexOutOfBoundsException: 5 // finally
- try-with-resources 문
리소스를 자동 해제하도록 제공해주는 구문으로 Java 7부터 제공된다.
close()를 명시적으로 호출하지 않아도 try {} 블록에서 열린 리소스는 정상적인 경우와 예외 발생한 경우 모두 자동으로 해제된다. 해당 리소스가 AutoCloseable 인터페이스를 구현해야 한다.
FileInputStream의 경우 AutoCloseable을 구현하고 있다.// try-catch-finally FileInputStream fis = null; try { fis = new FileInputStream("a.txt"); } catch (FileNotFoundException e) { System.out.println(e); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } // try-with-resources try (FileInputStream fis = new FileInputStream("a.txt")) { } catch (IOException e) { System.out.println(e); }
Java 9 부터는 try 안에서 사용하고자 하는 리소스를 선언 및 할당하지 않고 외부의 참조 변수를 가져오는 것이 가능하다.
// from Java 9 AutoCloseObj obj = new AutoCloseObj(); try (obj) { } catch (Exception e) { System.out.println("exception"); }
-
예외 처리 미루기
throws를 사용하여 예외 처리를 미룰 수 있다. 메서드 선언부에 throws를 추가하면 예외가 발생한 메서드에서 예외 처리를 하지 않고, 이 메서드를 호출한 곳에서 예외 처리를 해야한다.
main()에서 throws를 사용하면 가상머신에서 처리된다.여러 예외를 한 블록에서 처리 하기
try { } catch (FileNotFoundException | ClassNotFoundException e) { }
- 다중 예외 처리 시 주의사항
예외가 다양한 경우 가장 최상위 클래스인 Exception 클래스에서 예외를 처리할 수 있다. 이 때 Exception 클래스는 다른 모든 예외 클래스의 최상위 클래스이므로 가장 마지막 블록에 위치해야 한다.try { } catch (FileNotFoundException e) { } catch (ClassNotFoundException e) { } catch (Exception e) { }
- 사용자 정의 예외 클래스 예제
public class IDFormatException extends Exception { public IDFormatException(String message) { super(message); } }
-
-
- 예외 처리
참조
- Do it! 자바 프로그래밍 입문: https://www.inflearn.com/course/자바-프로그래밍-입문/dashboard
Subscribe via RSS