예외(Exception)

이현주·2023년 8월 1일
1

JAVA

목록 보기
5/12
post-thumbnail

Error와 Exception

Error

시스템 레벨의 심각한 오류
시스템 수정으로 문제를 해결

예외 (Exception)

프로그램 레벨의 일반적인 오류
코드 수정으로 문제를 해결

  • 프로그램의 실행 중 발생하는 여러 가지 오류를 의미한다
  • 예외가 발생하면 프로그램이 강제로 종료된다
  • 예외가 발생하더라도 프로그램이 종료되지 않도록 예외처리를 해야 한다
  • try catch 문을 이용해서 예외 발생으로 인해 프로그램이 종료되는 것을 회피할 수 있다

Exception의 구조

Exception 클래스

  • 모든 예외 클래스의 슈퍼클래스
  • 명시적 예외 처리 여부에 따라 Checked/Unchecked Exception 으로 구분

Checked Exception

  • RuntimeException 클래스의 자식클래스가 아닌 모든 예외 클래스
  • 반드시 try catch 문으로 예외 처리를 해야 함
  • IOException , SQLException 등

Unchecked Exception

  • RuntimeException 클래스의 자식클래스로 등록된 모든 예외 클래스
  • try catch 문이 없어도 실행 가능
  • NullPointerException , NumberFormatException 등

예외처리

try-catch문

-예외를 처리할 때 사용하는 코드
-실행할 코드는 try 블록에 두고 예외를 처리할 코드는 catch 블록에 두는 방식
-try블록의 코드를 실행하다가 예외가 발생되면 발생된 예외는 자동으로 catch블록으로 전달된다
-모든 예외는 자바 클래스로 만들어져 있다

형식

 try {
실행코드
} catch(예외 타입 선언 )
예외처리 코드
}

예시

   try {
      
      String name = "tom";
      Integer.parseInt(name); // 발생한 NumberFormatException을 catch 블록으로 Java가 던진다.
      
    } catch(RuntimeException e) {//RuntimeException,Exception 가능 
      System.out.println("예외발생");
    }

finally

1.try-catch문의 마지막 블록으로 추가할 수있다.(생략 가능)
2. 예외 발새 여부와 상관없이 "항상 마지막" 에 처리된다.
3.주로 어떤 자원을 반납 (close) 할 때 사용된다

형식

try {
실행 코드
} catch(
예외 타입 선언 )
예외 처리 코드
} finally {
무조건 실행되는 코드
}

예시

 Scanner sc=null;//선언
    //나이를 입력 받아서 "주류 구매 가능","주류 구매 불가능" 출력하기
   
    try {
   
    sc=new Scanner(System.in);//생성
    System.out.println("나이를 입력하시오");
    int age=sc.nextInt();
    
        System.out.println((age>19)? "주류 구매 가능":"주류 구매 불가능");
        
    }
    catch(Exception e){
     System.out.println("숫자를 입력하시오");
     
    }finally {
      
      sc.close();//finally는 주로 자원 반납용으로 사용한다.
    }
  }

throw

1.예외 객체를 직접 생성(new)해서 던질 때 사용한다.
2. Java는 예외로 판단하지 않는 것들을 던질 때 사용한다.
3. 개발자가 직접 예외를 처리할 때 사용한다.

형식

try {
if(
예외 상황이면 )
throw new
RuntimeException 예외 메시지
}
} catch(
RuntimeException e) {
System.out.println
e.getMessage ()); // 예외 메시지
}

예시

Scanner sc=null;
  
  
   try {
  
   sc=new Scanner(System.in);
   System.out.println("나이를 입력하시오");
   int age=sc.nextInt();
   if(age<0||age>100) {throw new RuntimeException();}//직접 RuntimeException을 발생시켜서 던진다.
       System.out.println((age>19)? "주류 구매 가능":"주류 구매 불가능");
       
   }
   catch(Exception e){
    System.out.println("숫자를 입력하시오");
    
   }finally {
     
     sc.close();
   
 }

 }

throws

1.메소드에서 발생하는 모든 예외를 던질 때 사용한다.
2. 메소드 내부에서 try-catch를 처리하지 않고, 메소드를 호출하는 곳으로 예외를 던질 때 사용한다.
3. 메소드를 호출하는 곳에서 try-catch를 처리한다.


주요 예외클래스

Unchecked Exception

  • ArithmeticException
    산술연산의 문제로 인해 발생 (0 으로 값을 나누는 경우

  • ClassCastException
    어떤 객체를 변환할 수 없는 클래스타입으로 변환 ( 하는 경우에 발생

  • IndexOutOfBoundsException
    배열의 인덱스가 범위를 벗어난 경우에 발생

  • NullPointerException
    null값을 참조하는 경우에 발생 (null 값으로 메소드를 호출할 때

  • NumberFormatException
    String을 Number 타입으로 변환하지 못하는 경우에 발생

Checked Exception

  • ClassNotFoundException
    클래스를 찾을 수 없는 경우에 발생

  • FileNotFoundException
    파일을찾을 수 없는 경우에 발생

  • NamingException
    자원(Resource) 의 이름을 확인할 수 없는 경우에 발생

  • IOException
    입출력 동작이 실패하는 경우에 발생

  • SQLException
    데이터베이스 처리가 실패하는 경우에 발생


throws

  1. 메소드에서 발생하는 모든 예외를 던질 때 사용한다.
  2. 메소드 내부에서 try-catch를 처리하지 않고, 메소드를 호출하는 곳으로 예외를 던질 때 사용한다.(메소드 외부로 예외를 던질 때 throws 문을 이용해 던지는 예외를 명시함)
  3. 메소드를 호출하는 곳에서 try-catch를 처리한다.
  4. 2개 이상의 예외를 명시할 수 있기 때문에 throw 가 아닌 throws 라고 함

메소드 내부에서 예외를 처리

public class
ThrowsEx
public static void method() {
try {
메소드
내부 코드
} catch(Exception e) {
예외
처리 코드
}
}
public
static void main(String[] args )
method
}
}

메소드 외부로 예외를 던짐

public class
ThrowsEx
public static void method() throws Exception {
메소드
내부 코드
}
public
static void main(String[] args )
try
method
}
catch(Exception e) {
예외
처리 코드
}
}
}

예시

//print 메소드 정의
  //throws NullpointerException: 메소드를 호출할 때 NullPointerException 처리가 필요하다.
  public static void print(String str)throws NullPointerException
  {
    System.out.println("첫 글자:"+str.substring(0,1));
    System.out.println("나머지 글자:"+str.substring(1));
    
    
  }
  
  public static void main(String[]args)
  {
    
    try {
    //print 메소드 호출 
    print("홍길동");
    print(null);
    
  }catch(NullPointerException e) {
    System.out.println(e.getMessage());
  }
  
  
}
profile
졸려요

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

좋은 정보 감사합니다

답글 달기