-
학원 DAY24. 예외 처리기록 2022. 10. 8. 17:52
예외처리
- 예외처리란, 프로그램 실행 시 발생할 수 있는 오류에 대비하는 것으로 프로그램 비정상종료를 막고 실행 상태를 유지하는 것이다.
오류의 종류 (에러, 예외)
에러 (Error)
- 시스템, 운영체제, 자바가상머신의 오류가 원인이다.
- 개발자가 처리할 수 없는 오류다.
- 예외처리의 대상이 아니다.
예외 (Exception)
- 개발자의 코딩 실수, 사용자의 잘못된 사용으로 발생하는 오류가 원인이다.
- 예외는 예외처리를 통해서 프로그램의 비정상적인 종료를 방지할 수 있다.
- 예외는 UncheckedException(컴파일러가 예외처리 여부를 체크하지 않는 예외)과 CheckedException(컴파일러가 예외처리 여부를 체크하는 예외)이 있다.
* 최신의 라이브러리나 프레임워크는 대부분 UncheckedException을 사용한다.
자바가상머신에서는 메소드를 실행하다가 오류 상황이 발생하면 오류상황에 맞는 예외클래스들을 미리 만들어놓고 이를 사용해서 예외객체를 만든다.
예외객체 안에는 오류정보(메시지)를 담아둔다. 그리고 예외객체를 자바가상머신에 던진다(throws). 그러면 자바가상머신이 어떤 오류가 발생했는지 알려주고 프로그램이 종료된다. 이를 예외가 발생했다고 한다.
예외객체가 자바가상머신까지 안가도록 처리하는 것이 예외처리이다.
오류발생시 조치방법.
오류가 발생했을 때 가장 먼저 해야하는 것은 예외클래스의 이름을 먼저 확인한다.
첫번째 라인에 모든 정보가 들어있다. 어떤 예외가 발생했는지, 예외의 원인을 찾아야 한다.
어디에서 오류가 발생했는지 항상 위에서 아래로 찾는다.
내가 작성한 클래스를 찾아본다. 내가 작성한 클래스에서 수정할 수 있으니까.
내가 작성한 클래스들이 여러 개 나오면 제일 첫번째로 나온 클래스에서 수정해야 한다.
오류가 발생하는 순간 밑에 코드들이 실행되지 않는다.
CheckedException은 오류가 발생하면 빨간줄을 보여주면서 실행하지 않는다.
UnCheckedException은 오류가 발생해도 빨간줄을 보여주지 않는다.
RuntimeException을 상속받은 것은 모두 UncheckedException이다.
사용자정의 Exception을 만들 수도 있는 Exception을 상속받으면 CheckedException이 만들어지고, RuntimeException을 상속받으면 UncheckedException을 만든다.
UnCheckedException
- RuntimeException 클래스와 그 자식 클래스들이다.
- 주로 개발자의 코딩 실수로 발생되는 오류들이다.
- 컴파일러가 예외처리 여부를 체크하지 않는다.
- 주요 예외 클래스
RunTimeException (실행 예외)
모든 UnChecked Exception의 부모 클래스다.
NullPointerException
참조변수의 값이 null인 상태에서 필드나 메소드를 사용할 때 발생하는 예외 클래스다.
ClassCastException
클래스 형변환이 가능하지 않을 때 발생하는 예외 클래스다.
ArithmeticException
나눗셈에서 어떤 값을 0으로 나눌 때 발생하는 예외 클래스다.
IndexOutOfBoundsException
배열, 리스트, 문자열에서 인덱스 범위를 벗어난 위치를 조회했을 때 발생하는 예외 클래스다.
NumberFormatException
숫자가 아닌 문자를 포함하고 있는 문자열을 정수나 실수로 변환할 때 발생하는 예외 클래스다.
Integer.parseInt(s), Double.parseDouble(s) 등을 실행할 때 발생한다.
CheckedException
- Exception 클래스와 Exception 클래스의 하위 클래스중에서 RuntimeException 클래스의 하위 클래스가 아닌 예외클래스다.
- 사용자의 잘못된 사용으로 인해 발생하는 오류들이다.
- 컴파일러가 예외처리 구현 여부를 반드시 체크한다.
- 예외처리 관련 코드가 구현되어 있지 않으면 컴파일 오류가 발생한다.
- 최신의 라이브러리나 프레임워크에서는 CheckedException의 사용비중이 점점 줄어들고 있다.
- 주요 클래스
Exception
모든 Checked Exception의 부모 클래스다.
ClassNotFoundException
클래스파일을 찾을 수 없을 때 발생하는 예외클래스다.
IOException
읽기/쓰기 하는 도중 오류가 발생했을 때 발생하는 예외클래스다.
네트워크를 통해서 다른 컴퓨터와 데이터 교환중 오류가 발생했을 때 발생하는 예외클래스다.
FileNotFoundException
파일을 찾을 수 없을 때 발생하는 예외 클래스다.
SQLException
데이터베이스 엑세스 작업 중 오류가 발생했을 때 발생하는 예외클래스다.
try ~ catch 구문으로 예외처리하기
- try~catch 구문을 사용해서 직접 예외를 처리할 수 있다.
- throws를 사용해서 예외처리를 위임할 수 있다. (예외를 나를 호출한 메소드에게 위임한다.)
- try ~ catch 구문 작성법
try { 예외발생이 예상되는 수행문; 예외발생이 예상되는 수행문; 수행문; } catch(예외클래스타입 변수명) { } catch(예외클래스타입 변수명) { } catch(Exception 변수명) { }
- try 블록에서는 예외발생이 예상되는 수행문을 적는다.
- catch 블록은 try 블록에서 예외가 발생했을 때 해당 예외를 잡는다.
- catch 블록에서 예외를 잡지않으면 프로그램이 비정상적으로 종료된다.
- try 블록에서 여러 종류의 예외발생이 예상되는 수행문을 적었을 경우에는 그 예외의 종류만큼 catch 블록을 추가한다.
- catch 블록에서는 발생한 예외를 잡고, 그 예외발생시 실행할 수행문을 적는다.
- catch 블록에서는 작업내용
- 발생한 예외정보를 로그로 기록하기
- 사용자에게 에외발생원인 안내하기
- 개발자에게 오류 수정을 위한 디버깅메세지 출력하기
- 발생한 예외를 다른 예외로 바꾸기
- catch 블록을 작성할 때는 부모예외클래스를 잡는 catch블록을 아래쪽에 적는다.
- 맨 마지막 catch 블록에는 Exception 클래스를 지정해서 예상하지 못한 예외도 잡을 수 있도록 한다. ( 부모타입에서 모든 예외를 처리할 수 있기 때문에 부모 밑에 자식 예외 타입을 적으면 오류 발생)
- try ~ catch 구문으로 예외처리시 수행문 실행
try { 예외발생이 예상되는 수행문1; 수행문2; 수행문3; } catch (발생이예상되는예외클래스명 변수명) { 예외 발생시 실행될 수행문4; 예외 발생시 실행될 수행문5; } 수행문6;
- 수행문1에서 예외발생하지 않는 경우 실행되는 수행문
- 예외발생이 예상되는 수행문1
- 수행문2
- 수행문3
- 수행문6
- 수행문1에서 예외가 발생하는 경우 실행되는 수행문
- 예외발생이 예상되는 수행문1
- 예외 발생시 실행될 수행문4
- 예외 발생시 실행될 수행문5
- 수행문6
throws로 예외처리 위임하기
- 메소드에서 발생하는 예외를 직접 처리하지 않고, 그 메소드를 호출하는 측으로 예외처리를 위임하는 것이다.
- throws 키워드를 사용해서 예외처리를 위임할 수 있다.
- 예외를 위임하기
public void method() throws 예외클래스명, 예외클래스명, ... { 예외발생이 예상되는 수행문; 예외발생이 예상되는 수행문; }
- 해당 메소드에서 예외처리와 관련한 코드의 작성을 할 필요가 없다.
- 예외처리를 각각의 메소드에서 직접 개별적으로 처리하지 않고, 한 군데에서 일괄처리하게 만들 수 있다.
- 단계가 많으면 많을수록 throws에 적어야하는 예외가 많아질 것이다.
- 그런데, UncheckedException은 throws를 안적어도 알아서 호출하는 측으로 던져진다.
예외처리 예제
package day25; import java.io.FileWriter; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionApp3 { public static void main(String[] args) { try { Date date = ExceptionApp3.stringToDate("2012-12-31"); System.out.println(date); ExceptionApp3.writeText("안녕하세요"); } catch (ParseException ex) { System.out.println("### 올바른 날짜 형식의 문자열이 아닙니다."); } catch (IOException ex) { System.out.println("### 입출력 작업 중 오류가 발생하였습니다."); } catch (Exception ex) { System.out.println("### 알 수 없는 오류가 발생하였습니다."); } } // 예외처리를 이 메소드를 호출하는 측에게 위임함 public static Date stringToDate(String text) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(text); return date; } public static void writeText(String text) throws IOException{ FileWriter writer = new FileWriter("sample.txt"); writer.write(text); writer.flush(); writer.close(); } }
'기록' 카테고리의 다른 글
메소드 작성 관련 (0) 2022.10.08 학원 DAY24. 맵 활용하기 (0) 2022.10.08 학원 DAY23. 매개변수의 결정, 콜렉션과 맵 (0) 2022.10.06 학원 DAY 22. Iterator<E> 인터페이스 (0) 2022.10.06 학원 DAY 21. Collection 컬렉션 (0) 2022.10.05