예외 처리( try~catch )
try {
정상 명령문;
} catch(예외 클래스 e) {
예외 시 명령문;
} catch(예외 클래스 e) {
예외 시 명령문;
}
- 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것을 "예외"라고 하며 이것을 처리하는 것을 "예외 처리"라고 한다.
- 자바에서 range 범위 초과나 기타 에러가 발생하였을 경우에 예외처리를 하여 오류 시 프로그램이 비정상 종료되는 것을 막을 수 있다.
- 하나의 try 안에 여러개의 catch가 올 수 있다. 근데 각 동작마다 예외처리를 주게되면 너무 타이트하고 코드 가독성이 떨어지고 비효율적이므로, 가장 부모 클래스인 Exception하나만 이용하여 모든 예외처리를 할 수 있다. 근데 또 이렇게 되면 너무 러프해지기 때문에 특정 조건의 예외처리문만 몇개 추가하고 싶을때는 해당 예외처리 클래스만 예외처리 하고 나머지는 Exception으로 하면 이런 문제를 해결할 수 있다.
아래 예시처럼 부모인 Exception이 가장 나중에 와야함.
(단, 예외 처리의 범위가 작은 것 부터 와야함.)
catch (ArithmeticException e) {
}
// ..
// ..
// ..
catch (Exception e) {
}
finally
- finally로 감싸져 있을 경우 예외 발생 여부와 상관 없이 무조건 실행된다.
catch (ArithmeticException e) {
}
catch (Exception e) {
}
finally {
System.out.println("무조건 실행 됌");
}
메소드에서 예외 처리하는 두가지 방법
1. 호출 당한 메소드 안에서 직접 try ~ catch 처리
호출당한 calcDiv() 에서 예외처리
public static void calcDiv(int a, int b) {
try {
int div = a/b;
System.out.println("나누기 결과: "+div);
}
catch(ArithmeticException e) {
System.out.println("0으로 나눌 수 없어요");
}
}
2. 메소드를 호출하는 쪽에 예외처리를 맡긴다 (throws 사용)
- 해당 메소드 맨 뒤에 [throws 예외클래스] 를 추가하여 예외처리를 호출한 쪽에 맡기기
public static void 메소드명 throws 예외클래스명1, 예외클래스명2{
호출한 main()에서 직접 예외처리
public static void calcDiv(int a, int b) throws ArithmeticException {
int div = a/b;
System.out.println("나누기 결과: "+div);
System.out.println("0으로 나눌 수 없어요");
}
public static void main(String[] args) {
try {
calcDiv(9,3);
}catch (ArithmeticException e) {
System.out.println("0으로 나눌수 없어요!");
}
}
RuntimeException 과 이외의 예외처리 특성
1. RuntimeException
예외처리의 종류는 크게 RuntimeException 이냐 아니냐로 나눌 수 있다.
- RuntimeException의 자식들은 사용자가 예외처리를 하지 않아도 컴파일이 가능하고 자바가 예외처리를 해줍니다.
- 물론, 필요하다면 사용자가 직접 예외처리를 할 수도 있음
- 실행이 된다는 것 자체가 자바가 예외처리를 해준거임 (에러가 나와도 에러가 나오는 거 자체가 예외처리 된거임)
예시) ArithmeticException은 RuntimeException의 후손
2. RuntimeException 이 아닐 경우
- 그러나 RuntimeException의 자식이 아닌 것들은 사용자가 반드시 직접 예외처리를 해야한다.
- 만약 사용자가 직접 예외처리를 하지 않으면 컴파일이 되지 않는다.
예시) IOException
public FileWriter(String fileName) throws IOException
- FileWriter 예외처리시 사용되는 IOException은 RuntimeException 자식이 아니기 때문에 필수적으로 예외처리를 해줘야한다. (IOException)
- IOExcepton은 바로 Exception을 상속 받음
FileWriter 실행 시 에러 (예외처리 안해서)
IOException 예외처리 완료
아래 예시 IOException은 RuntimeException의 자식이 아니므로 try ~ catch로 직접 예외해줘야함
try {
FileWriter fw = new FileWriter("c:/temp/hello.txt");
fw.write("hello java");
fw.close();
System.out.println("파일이 생성되었습니다.");
}catch(IOException e) {
System.out.println("예외가 발생");
System.out.println(e.getMessage());
}
강제로 예외 발생 시키기 (throw)
- 때로는 강제로 예외를 발생시켜야 할 경우도 존재하는데 그때는 throw 키워드를 사용 (throws랑 헷갈리지 말것)
- 강제로 예외 발생시켰는데 RuntimeException의 자식이 아니면 당연히 try ~ catch 로 예외처리 해야함
throw new 예외클래스이름("메세지 입력 가능");
System.out.println("hello");
throw new ArithmeticException();
throws - 메소드 안에서 예외 발생 시 메소드를 호출한 쪽에서 예외처리를 할 수 있도록 하는 키워드
throw - 강제로 예외를 발생 시키는 키워드
사용자 정의 예외 만들기
- 예외 처리 클래스를 생성
- throw new [예외처리클래스이름]
class 예외클래스이름 extends Exception{
생성자(String msg){
super(msg);
}
}
class NotFoundException extends Exception {
public NotFoundException(String msg) {
super(msg);
}
}
반응형
'개발 > 자바' 카테고리의 다른 글
자바 컬렉션 (Set, List, Map) (0) | 2022.04.09 |
---|---|
p370) 3번 문제 - 가위바위보 (0) | 2022.04.07 |
Wrapper 클래스 (0) | 2022.04.07 |
char - int (다른 자료형 끼리 연산) (0) | 2022.04.07 |
자바 String 처리 방법 (0) | 2022.04.07 |
댓글