예외처리(Exception Handling)
- 예외(Exception) : 컴파일 오류가 아닌 프로그램 실행시 특정한 상황에서의 문제를 의미합니다.
- 예외는 if문을 이용해서 처리할 수 도 있으나 코드가 복잡해지는 단점이 있습니다.
메소드들 중에는 예외처리를 반드시 해야만 사용할 수 있는 메소드도 있습니다.
여기에서의 예외처리는 if문을 이용한 예외처리가 아닌 예외처리 전용 문법을 사용해야 합니다.
- 예외도 자바에서는 하나의 클래스로 작업됩니다.
- 모든 예외 클래스는 java.lang.Exception클래스를 상속받아 동작합니다.
- 문법
try{
예외가 발생할 것 같은 실행문들;
}catch(예외 클래스 - try문에서 발생한 예외){
발생한 특정 예외에 대한 처리;
}catch(다른 예외 클래스){
다른 예외에 대한 처리;
}finally{
예외 발생여부와 상관없이 반드시 동작되는 영역
중간에 return이 발생해도 먼저 실행된 후 return되는 영역
}
try-catch문의 catch절은 필요한 예외의 개수만큼 반복해서 사용할 수 있습니다.
catch절의 예외클래스는 반드시 하위클래스부터 입력해야 합니다. (상위 클래스부터 입력하면 아래에 하위클래스 입력시 오류가 발생합니다.)
.
.
예제
먼저 Exception클래스를 모른다고 하였을 때 if문으로 예외처리를 해보겠습니다.
import java.util.*;
class ExceptionHandleIf
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int[] arr = new int[100];
for (int i = 0 ; i < 3 ; i++)
{
System.out.print("나누어 지는 수 : ");
int n1 = sc.nextInt();
System.out.print("나누는 수 : ");
int n2 = sc.nextInt();
if (n2 == 0)
{
System.out.println("0으로는 나눌 수 없습니다.");
i--;
continue;
}
System.out.print("저장할 인덱스 번호 : ");
int idx = sc.nextInt();
if (idx < 0 || idx > 99)
{
System.out.println("0~99 사이의 번호를 입력하세요.");
i--;
continue;
}
arr[idx] = n1 / n2;
System.out.println("나눗셈 결과 : " + arr[idx]);
System.out.println("인덱스 번호 : " + idx);
}
}
}
.
.
if문으로 예외처리가 가능하지만 try-catch문을 사용해서도 예외처리가 가능합니다.
.
.
try-catch문 예외처리 예제
import java.util.*;
class ExceptionHandleTry
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int[] arr = new int[100];
for (int i = 0 ; i < 3 ; i++)
{
try
{
System.out.print("나누어 지는 수 : ");
int n1 = sc.nextInt();
System.out.print("나누는 수 : ");
int n2 = sc.nextInt();
System.out.print("저장할 인덱스 번호 : ");
int idx = sc.nextInt();
arr[idx] = n1 / n2;
System.out.println("나눗셈 결과 : " + arr[idx]);
System.out.println("인덱스 번호 : " + idx);
}catch (ArithmeticException e){
System.out.println("0으로는 나눌 수 없습니다.");
i--;
continue;
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("0~99 사이의 번호를 입력하세요.");
i--;
continue;
}catch(Exception e){
// 모든 종류의 예외를 catch하는 클래스(Exception)
System.out.println("알 수 없는 오류가 발생하였습니다.");
System.out.println(e.getMessage());
// 받아온 예외클래스에 대한 메세지 출력
}
}
}
}
try-catch로 좀 더 깔끔하게 정리할 수 있습니다.
.
.
finally 예제
class FinallyTest
{
public static void main(String[] args)
{
boolean divOK = divider(4, 2);
if (divOK) System.out.println("연산 성공");
else System.out.println("연산 성공");
divOK = divider(4, 0);
if (divOK) System.out.println("연산 성공");
else System.out.println("연산 성공");
}
public static boolean divider(int n1, int n2){
try
{
int result = n1 / n2;
System.out.println("나눗셈 결과 : " + result);
return true;
}
catch (ArithmeticException e)
{
System.out.println(e.getMessage());
return false;
}finally{
// try-catch문의 가장 밑에 존재하며, 어떠한 경우에라도 동작되는 영역
// 도중에 return을 해도 finally영역을 동작한 후 return함
System.out.println("finally 영역 실행");
}
}
}
'Java > 본격 Java 인터페이스' 카테고리의 다른 글
[Java] throw 예외처리 (0) | 2020.07.01 |
---|---|
[Java] 자주사용되는 예외 (0) | 2020.07.01 |
[Java] 인터페이스(interface) 다중 상속 (0) | 2020.07.01 |
[Java] Interface(인터페이스) (0) | 2020.07.01 |
[Java] Interface(인터페이스) - abstract class(추상화 클래스) (0) | 2020.07.01 |