٩(๑•̀o•́๑)و

20200311 - 예외와 예외처리 본문

Java

20200311 - 예외와 예외처리

11mia 2020. 3. 11. 01:05

오류

  • 컴파일 오류 : 프로그램 코드 작성 중 발생하는 문법적인 오류
  • 실행 오류 : 실행중인 프로그램이 의도 하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류(runtime error)
  • 자바는 예외 처리를 통하여 프로그램의 비정상적인 종료를 막고 log를 남길 수 있음

오류와 예외 클래스

  • 시스템 오류(Error) : 가상 머신에서 발생, 프로그래머가 처리할 수 없음. 동적 메모리를 다 사용한 경우, stack over flow등
  • 예외(Exception) : 프로그램에서 제어할 수 없는 오류. 읽으려는 파일이 없는 경우, 네트워크나 소켓 연결 오류 등. 자바프로그램에서는 예외에 대한 처리를 수행 함
  • Error, Exception -> Throwable
  • 예외 클래스 : 모든 예외 클래스의 최상위 클래스는 Exception 클래스
  • 입출력 예외 처리(IOException) : FileNotFoundException, SocketException -> IOException -> Exception
  • 실행 오류 예외처리(RuntimeException) : ArithmeticException(나눌시 분모가 0), IndexOutOfBoundsException, NullPointerException -> RuntimeException -> Exception

 

https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html

try-catch문으로 예외 처리하기

try {

	예외가 발생할 수 있는 코드 부분

} catch(처리할 예외 타입 e){

	try블록 안에서 예외가 발생했을때 수행되는 부분

}

try-catch-finally 문으로 예외 처리하기

try {

	예외가 발생할 수 있는 코드 부분

} catch(처리할 예외 타입 e){

	try블록 안에서 예외가 발생했을때 수행되는 부분

} finally{
	
    예외 발생 여부와 상관없이 항상 수행되는 부분. 리소스를 정리하는 코드를 주로 사용

}

try-with-resources 문

  • 리소스를 자동으로 해제 하도록 제공해주는 구문
  • 해당 리소스가 AutoCloseable을 구현한 경우 close()를 명시적으로 호출하지 않아도 try{} 블록에서 오픈된 리소스는 정상적인 경우나 예외가 발생한 경우 모두 자동으로 close()가 호출 됨
  • java7 부터 제공됨
  • FileInputStream의 경우 AutoCloseable을 구현하고 있음

try-with-resources 문
https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html

AutoCloseable 인터페이스

예외 처리 미루기

  • throws 를 사용하여 예외처리 미루기
  • try{} 블록으로 예외를 처리하지 않고, 메서드 선언부에 throws 를 추가
  • 예외가 발생한 메서드에서 예외 처리를 하지 않고, 이 메서드를 호출한 곳에서 예외 처리를 한다는 의미
  • main()에서 throws를 사용하면 가상머신에서 처리 됨 -> 에러를 핸들링하는게 아님.

다중 예외 처리하기

  • 하나의 try{} 블록에서 여러 예외가 발생하는 경우 catch{} 블록 한곳에서 처리하거나 여러 catch{}블록으로 나누어 처리할 수 있음.
  • 가장 최상위 클래스인 Exception 클래스는 가장 마지막 블록에 위치해야함 - 디폴트 익셉션이라고도함. 모든 Exception들은 최상위 클래스인 Exception으로 업캐스팅이 가능함. 따라서 Exception 클래스는 반드시 가장 마지막에 위치해야함. 위로 올릴경우 나머지 catch문에서 unreachable error발생.

사용자 정의 예외

  • JDK에서 제공되는 예외 클래스 외에 사용자가 필요에 의해 예외 클래스를 정의하여 사용
  • 기존 JDK클래스에서 상속받아 예외 클래스를 만듦. 보통은 Exception을 상속받아 생성
  • throw 키워드로 예외를 발생시킬 수 있다.
  • Ex. 매개변수로 전달된 아이디가 null이거나 8자 이하 20자 이상인 경우 예외를 발생시키는 예외 클래스 작성