Java/Java(base)

[Java] 예외처리 try-catch-finally / throw throws 차이점 및 예제

ID_DI 2021. 12. 1. 23:39

예외처리

  • 에러 : 심각한 오류
  • 예외 : 덜 심각한 오류(객체)

try ~ catch ~ finally 예외처리문

try{
    예외가 발생할 수 있는 문장
}
catch(예외클래스명 객체명){
    예외 발생시 수행할 문장
}
...
finally{
    예외 발생 유무에 상관없이 무조건 실행할 문장
}

예외라는 틀(class)을 잡아놓은 객체가 있다

Exception class

  • 모든 예외들의 부모클래스
    • 모든 예외들은 Exception class의 자식클래스이기 때문에 자동으로 업캐스팅 upcasting 이 이루어짐
  • 어떤 예외가 발생하든지 Exception 타입으로 잡을 수 있다.
  • 어떤 예외가 발생할지 모를 떄 찾아내는 역할
try{
    예외가 발생할 수 있는 문장
}
catch(Exception e){
    System.out.println(e); //예외처리 클래스를 출력
}

throws

예외의 간단한 형태, 예외처리가 이미 구현되 있을 때 보통 사용
  • 메소드 선언부 내부에서 예외 발생시 무시(떠넘기기)
  • 예외처리를 메소드 호출한 곳에서 하겠다는 뜻
    • 메소드가 호출되었을 때, 예외처리를 해야하는 상황에서 호출당한 곳으로 예외처리를 하겠다는 뜻
  • 절대 처리용으로 사용하지 않는다.
리턴타입 메소드명() throws 예외1, 예외2, ...{
    예외1, 예외2, ... 무시하는 구역
}

throw

예외를 한번 더 처리하기 위해서 사용
  • 예외를 강제로 발생시키는 것
throw new 발생시킬예외 생성자();

throws throw 사용한 형변환 예제 Ex)

public class ExceptionTest{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String strNum1 = sc.nextLine();
        String strNum2 = sc.nextLine();
        try{
            Test test = new Test(strNum1, strNum2);
            test.sum();
        }
        catch(NumberFormatException Ne){
            System.out.println("숫자를 입력해주세요");
        }
        sc.close();
    }
}

class Test{
    String a;
    String b;

    public Test(String a, String b) {
        this.a = a;
        this.b = b;
    }

    public void sum() throws NumberFormatException{
        try{
            int sum = Integer.parseInt(a) + Integer.parseInt(b);
            //문자로 받은 a,b를 숫자로 변환하여 더한다.
            System.out.println("문자로 입력받은 " +a+ "와 " +b+ "의 합은" +sum+ "입니다." );
        }
        catch(NumberFormatException Ne){
            System.out.println("숫자형 문자가 아닙니다. 형변환을 할 수 없습니다.");
            throw Ne;
        }
    }
}
결과:
a
s
숫자형 문자가 아닙니다. 형변환을 할 수 없습니다.
숫자를 입력해주세요