[Java/자바]예외처리 try-catch-finally
안녕하세요 오늘은 자바에서 예외처리를 하는 방법 중 try-catch-finally문에 대해 알아보겠습니다!
예외처리를 알아보기전에 우선 예외란 무엇인지 알아봅시다!
예외란?(Exception)
예외란 프로그램 실행 중에 발생하는 오류를 의미합니다.
예외 종류
- 에러: 개발자가 조치를 취할 수 없는 수준 ex) 메모리 부족, JVM 동작이상
- 컴파일 에러: 컴파일 시 발생하는 에러 ex)오타, 잘못된 자료형…
- 런타임 에러: 프로그램 실행 도중에 발생하는 에러
- 로직 에러: 실행은 되지만 의도와는 다르게 동작하는 에러
- 예외 : 다른 방식으로 처리 가능한 오류 ex) 입력 값 오류, 네트워크 문제
예외 처리(Exception handling)란?
프로그램에서 예외가 발생했을 때 이를 적절히 처리하여 프로그램이 비정상적으로 종료되는 것을 막는 방법을 말합니다.
예를 들어 사용자가 정수를 입력해야 하는데 문자열을 입력했다 생각해봅시다.
=> 우리는 이러한 상황을 방지하기 위해서 사용자에게 숫자를 입력해야 한다고 출력문을 작성할 수 있는 것과 같이 이렇게 미연에 방지하여 예외를 처리할 수 있는 것이지요!
try-catch
:예외발생 시, 적절하게 처리하기 위해 자바에서 제공하는 예외처리 문법
자바의 모든 예외는 Exception클래스를 상속받습니다.
예를 들어 산술 오류가 발생한다면 ArithmeticException
배열의 길이에 문제가 있다면 ArrayIndexOutOfBoundsException과 같은 Exception을 상속받은 오류가 나게 되죠
Exception클래스의 간단한 상속 트리입니다.
[try-catch문]
try{
예외가 발생할 수 있는 명령
}
catch(발생할 수 있는 예외 클래스명){
예외 발생 시 실행할 명령;
}
try-catch문 예시 코드
public static void main(String[] args) {
try {
int []a= {2,0};
int b=4;
int c=b/a[2]; //문제점1
//배열의 index가 [0],[1]까지 밖에 없다.
System.out.println(c);
}catch(ArithmeticException e) {
System.out.println("산술 오류 발생");
}catch(ArrayIndexOutOfBoundsException a) {
System.out.println("배열 길이 오류발생");
}
System.out.println("예외처리 공부중");
}
}
예시를 위해 try문 안에 고의적으로 예외가 나는 코드를 넣었습니다.
a의 배열 인덱스는 [0], [1]까지 밖에 없지만
int c=b/a [2]; 인덱스 값으로 [2]를 입력해봤습니다.
따라서 배열 길이에 대한 에러가 발생하기 때문에 ArrayIndexOutOfBoundsException라는 클래스를 사용해주어야 합니다.
배열의 인덱스 값 오류에 대한 클래스인데 사실 이렇게 에러에 맞춰서 매개 값을 넣어주어도 되지만
ArrayIndexOutOfBoundsException클래스는 Exception클래스를 상속받았기 때문에 Exception을 사용하여도 됩니다.
출력 결과
finally문
finally문은 try-catch문에 선택적으로 추가할 수 있는 문법입니다. 오류가 발생하든 하지 않든 무조건 실행하는 구문입니다.
[구조]
try{
예외가 발생할 수 있는 명령
}
catch(발생할 수 있는 예외 클래스명){
예외 발생 시 실행할 명령;
}
finally{
예외가 발생하든 안하든 무조건 실행하는 명령;
}
finally 예시 코드
ublic class Try_Catch_Finally {
public static void main(String[] args) {
//외부로 접근
int a=0;
int b=2;
try {
System.out.println("외부로 접속");
int c=b/a;
//int c=b/3;
}catch(ArithmeticException e) {
System.out.println("오류가 발생하였습니다.");
}
finally {
System.out.println("무조건 연결해제");
}
}
}
try-catch문을 작성한 뒤 밑에 finally문을 넣어주었습니다.
출력 결과를 예측해 보자면 try문안에 있는 코드가 에러가 나든 안 나든 finally문을 실행할 것입니다.
출력 결과
에러가 안 났을 경우
public class Try_Catch_Finally {
public static void main(String[] args) {
//외부로 접근
int a=0;
int b=2;
try {
System.out.println("외부로 접속");
int c=b/3; //오류가 나지 않음
}catch(ArithmeticException e) {
System.out.println("오류가 발생하였습니다.");
}
finally {
System.out.println("무조건 연결해제");
}
}
}
출력 결과
위와 같이 에러가 나지 않는 코드인데도 finally안에 있는 문장이 출력된 것을 볼 수 있습니다.
이상으로 글 마치겠습니다
글 읽어주셔서 감사합니다!
