본문 바로가기
JAVA

day13) 예외처리

by code_learner 2022. 1. 13.

[예외란?]

:프로그램 실행 중 발생하는 오류 중 처리가 가능한 것을 의미

- 에러: 개발자가 조치를 취할 수 없는 수준 ex) 메모리 부족, JVM 동작 이상

- 컴파일 에러: 컴파일 시 발생하는 에러 ex)오타, 잘못된 자료형 등

- 런타임 에러: 프로그램 실행 도중에 발생하는 에러

- 로직 에러: 실행은 되지만 의도와는 다르게 동작하는 에러

- 예외: 다른 방식으로 처리 가능한 오류 ex) 입력값 오류, 네트워크 문제

 

*예외가 발생할 때 이를 적절히 처리하여 프로그램이 비정상적으로 종료되는 것을 막기 위해 예외처리를 해야한다.

 

 

 

[try-catch-finally]

-사용법-

try{

    예외가 발생할 수 있는 명령;

    try문에서 예외가 발생한다면, 즉시 catch문으로 이동한다

} catch(발생할 수 있는 예외 클래스명){

    예외 발생 시 실행할 명령;

    예외가 발생하지 않는다면 catch문으로 이동하지 않는다.

} finally{

    예외가 발생하든 안하든 무조건 실행하는 명령;

    사용하지 않아도 이상없음;

}

 

 

 

[객체로서의 예외]

-모든 예외 클래스들은 Exception클래스를 상속받으므로 Exception으로 한번에 처리가 가능하다.

-catch문안에서 예외들의 객체가 생성되므로 Exception클래스의 메서드가 사용가능하다.

    ex)getMessage(), toString(), printStackTrace()..

 

 

1. throw 예외발생

:프로그래머가 고의로 예외를 발생 시킬 때 사용하는 방법

 

<사용법>

Exception e = new Exception("오류메시지");

throw e;

->Exception 클래스는 생성자 오버로딩이 되어있어 오류메시지가 강제되지 않는다.

class MyException extends Exception{
   MyException(String message){
     
      super(message);
   }
}
public class Test03 {

   public static void main(String[] args) {

      MyException myExcep = new MyException("1~3이외의 입력은 불가능합니다.");

      Scanner sc=new Scanner(System.in);
      while(true) {
         System.out.print("입력>> "); // 1~3
         try {
            int num=sc.nextInt();
            if(num<1 || 3<num) {
               throw myExcep; 
               // throw는 일부러 예외를 발생시키기때문에,
               // 반드시 try-catch가 필요함!!!
            }
         }catch(Exception e) {
            System.out.println(e.getMessage());
         }
      }
//결과
//입력>> 5
//1~3이외의 입력은 불가능합니다.

-> 예외클래스를 상속받아서 나만의 예외클래스를 정의
    기존에는 예외가 아니었던 사항을 예외처리한다.
- 상세설명(message) 설정강제==> Exception은 기본 생성자가 제공되고있기에 강제x
- 미확인 예외들(Exception)과 섞임 방지

 

 

2.throws 예외던지기

:예외가 발생했을 경우 현재 메서드가 예외를 처리하지 않고 자신을 호출 한 쪽으로 예외 처리에 대한 책임을 넘기는 것

 

<사용법>

void method() throws Exception{}

예외 던지기시, 메서드 선언부에 throws키워드를 붙여, 메서드 호출하는 부분에서 처리하도록 한다.

예외처리에 대한 로직이 여러개 중복 될 수 있기 때문에 예외처리를 미루어 한곳에서 처리함으로 유지보수성이 증가한다.

public class Test02 {


   static void func1() throws Exception{
      // 예외처리를, 호출한 대상에게,공간으로 미루겠습니다!
      int a=10,b=0;
      System.out.println(a/b);
      System.out.println("func1()함수 종료!");
   }

   
   static void func2() throws Exception {
      Exception excep=new Exception("예외!!!");
      throw excep;
   }
   // 예외처리에 대한 로직이 여러개 중복될수있기때문에, => 유지보수에 굉장히 불리함!!!!!
   // 예외처리를 미루어처리합니다.
      
   public static void main(String[] args) {
   
      try {
         func2();
         func1();
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
      // func1()함수는, 현재 예외처리를 미루어 main메서드에서 처리해 주어야한다.
      
   }

}

 

 

'JAVA' 카테고리의 다른 글

day15) MVC패턴 기본구조  (0) 2022.01.14
day14) 파일 입출력  (0) 2022.01.14
day12) 컬렉션 프레임워크2  (0) 2022.01.11
day11)[컬렉션 프레임워크]ArrayList  (0) 2022.01.10
day09) 인터페이스  (0) 2022.01.02

댓글