Java - 예외처리

갓김치·2020년 9월 1일
0

자바 기타

목록 보기
1/8

참고

Exception_01.java
Exception_02.java
Exception_03.java

프로그램 오류

  • 프로그램이 실행중에 어떤 이유로 인해 오작동을 하거나 비정상적으로 종료되는 경우

컴파일오류 vs 런타임오류

컴파일오류

  • Ctrl+S 저장시 컴파일 중에 발생하는 오류

런타임오류

  • Ctrl+F11 프로그램 실행 중에 발생하는 오류

에러 vs 예외

에러

  • 프로그램 코드를 이용하여 수습될 수 없는 심각한 오류
  • 게임 오픈때 사람 몰려서 서버터질때, 대기열 방식 이용해서 입장인원 제한

예외

  • 프로그램 코드를 이용하여 수습될 수 있는 미약한 오류

Checked 예외 vs Unchecked 예외

Unchecked 예외

  • 컴파일러가 예외처리를 강제하지 않는 경우
    • RuntimeException 과 그 자손들의 경우에는 예외처리를 강제하지 않음
    • Error (어짜피 못고치니까)

Exception

  • 모든 예외의 최고 조상은 Exception

RuntimeException

  • 주로 프로그래머의 실수에 의해서 발생하는 예외
  • IndexOutOfBoundsException: 배열에서 방번호 넘어갈 때
  • NullPointException: 객체 생성이 안됐는데 그 멤버들을 호출하려고 했을 때
RuntimeException re = new RuntimeException("2팀 지켜본다.");
try{
    throw re;
}catch(RuntimeException e){
    re.printStackTrace();
}

그외Exception

  • 외부의 영향에 의해서 발생하는 예외
  • ClassNotFoundException: 클래스 못 찾음, 가끔 시스템 오류로 컴파일 되지 않는 경우가 있음
  • FileNotFoundException: 파일은 넣어놨는데 시스템 오류로 못 찾을 때
Exception e1 = new Exception("지각하지마!");

try{
    throw e1;
}catch (Exception e{
    System.out.println("예외 발생시키기 성공쓰~!");
    System.out.println(e.getMessage()); //이유만
    e.printStackTrace();// 실제 예외 발생시, 위치+이유 출력
}

try-catch

  • 프로그램 실행시 발행할 수 있는 예외에 대비한 코드를 작성하는 것

사용방식

try{
    //예외가 발생할 수 있는 코드
}catch(Exception e){ //예외종류
    // 수행한 코드에서 Exception 이라는 예외가 발생했을 때 처리할 문장
}catch(Exception e2){ //예외종류
    // 수행한 코드에서 Exception 이라는 예외가 발생했을 때 처리할 문장
}
  • 발생한 종류의 예외와 일치하는 하나의 catch만 수행된다.
  • 예외가 2개다 발생하면 첫번째 문장만 수행

예시

int number = 100;
int result = 0;

for(int i = 0 ; i <10 ; i++){
    int random = (int)(Math.random()*5);
    try{
        result = number/random; //★ 그룹핑 주의
        System.out.println(result); //★ 예외발생하면 result없음
    }catch(ArithmeticException e){
        System.out.println("0으로 나누지말라고..내가..그랬자나..");
    }
}

System.out.println("종료");

예외발생시키기 throw

  • 연산자 new를 이용하여 발생시키고자 하는 예외의 객체를 만든다.
Exception e1 = new Exception();
  • 예약어 throw를 이용하여 예외를 발생시킨다.
throw e1;
throw new Exception();

예외던지기 throws

  • 메서드에 예외 선언하기
    • 메서드의 선언부 마지막에 예약어 throws와 함께 예외 종류를 적어주기만 하면된다.
    • 예외의 처리는 해당 메서드를 호출한 쪽에서 예외 처리
public class Exception_04 {
    public static void main(String[] args) {
         //여기가 View라고 생각
         
         Controller.idCheck();
    }
}

class Controller{
    static void idCheck(){//원래는 인스턴스, 편의를 위해 static
        Service.idCheck();
    }
}

class Service{
    static void idCheck(){
        try {
            Dao.idCheck(); //Dao 오류-Service가 처리, db트랜잭션 오류도 Service에서
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

class Dao{
    static void idCheck() throws SQLException{ //여러개 가능
        SQLException sq = new SQLException("ORA-0001");
        throw sq;
    }
}

finally 블럭

  • try-catch 블럭에 상관없이 수행되어야할 코드를 포함한다

사용형식

try{
    //예외가 발생할 수 있는 코드
}catch(Exception e){
    //수행한 코드에서 Exception 이라는 예외가 발생했을 때 처리할 문장
}catch(Exception e){
    //수행한 코드에서 Exception 이라는 예외가 발생했을 때 처리할 문장
}finally{
    //예외발생에 상관없이 수행되어야 할 코드
}

예시

public class Exception_05{
    public static void main(String[] args){
        try{
            copyFiles();
            install();
            //deleteFiles();
        }catch (Exception e) {
            e.printStackTrace();
            //deleteFiles();
        }finally{
            deleteFiles(); //어짜피 실행되니까 여기로 빼줌
        }
    }
    
    static void copyFiles(){
    
    }
    
    static void install();{
    
    }
    
    static void deleteFiles(){
    
    }
}
profile
갈 길이 멀다

1개의 댓글

comment-user-thumbnail
2020년 10월 17일

참고 잘 했더용 ^_^💘

답글 달기