본문 바로가기

Programming Language/JAVA

[JAVA] 예외(exceptional event) 강제예외,예외전가,예외처리 try-catch, finally

 

 

예외(exception)
: 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의해 발생하는 오류이다.

 

 

외종류
- 강제 예외 : throw
- 예외 전가 : throws
- 예외 처리 : try() catch()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {
		int[] arr = {1,2,3};
		for(int i=0;i<5;i++) {
			try {
				System.out.println(arr[i]);
			}catch(Exception e){
				System.out.println("문제발생"+i);
			}
		}
	}

}

위 소스를 보면 arr변수의 배열에 1,2,3을 저장해주었습니다.
그리고 for 반복문을 통해 배열을 출력해주는데 저장된 갯수는 총 3개인데 for문에 5까지 실행하면 에러가 발생합니다.
이러한 에러를 처리해주기위해 try-catch문을 사용합니다.
try()안에는 에러가 발생할수도있는 문구를 넣어주고 만약에 에러가 발생하면 이렇게 처리해달라고 소스를 적는것이 catch()입니다. 그래서 만약 try()안에 에러발생시, catch()안에 적어줬던 "문제발생"문구출력과 해당 for문의 i변수를 출력해줍니다.
0부터2까지는 정상적으로 arr[]배열에서 출력이되고 arr배열에 저장되어있지 않은 값은 3과4가 되기에 문제발생3 , 문제발생4가 출력됩니다.

 

 

 

 

 

import java.util.Scanner;
public class Test {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr = {1,2,3};
		int result,num1,num2;
		System.out.println("두 수입력");
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		try {
			result=num1/num2;
		for(int i=0;i<5;i++) 
			System.out.println(arr[i]);
		}catch(ArrayIndexOutOfBoundsException e ) {
			System.out.println("인덱스 예외");
		}catch(ArithmeticException e) {
			System.out.println("0으로 나눌수없습니다.");
		}
	}
}

위처럼 catch를 두번적어줄수있습니다. (개수는 상관없음)
두수를 입력받고 try문에 에러가 뜰만한 소스를 입력해주고, 만약 0을 입력하면 0으로 나눌수없다는 문구를 출력해줍니다.
대신, catch문의 괄호안에는 ArithmeticException을 적어주고 e변수를 매개변수로 받습니다.
0으로 나눌수없다는 에러 이벤트 발생시 0으로나눌수없다는 문구를 출력해줍니다.
catch문의 괄호안에 ArrayIndexOutOfBoundsException는 배열을 참조하는 인덱스 잘못된경우 이벤트가 발생하는데
이 에러발생을 e변수로 받아주고 인덱스예외라는 문구를 출력합니다.

 

 

 

 

 

class Excep {
	public void exc() {
		System.out.println("무조건 실행할 코드");
	}
}

public class Test {

	public static void main(String[] args) {
		int x = 10, y = 0, result = 0;
		Excep ex = new Excep();
		try {
			result = x/y;
			System.out.println(x+"/"+y+"="+result);
		}catch(Exception a) {
			System.out.println("나눌수 없습니다.");
		}
		finally {
			ex.exc();
			System.out.println("종료하겠습니다.");
		}
	}

}

* finally을 실습해보겠습니다.

 

Excep 클래스를 선언해주고 생성자에 무조건 실행할 코드라는 문구를 출력하게 선언합니다.
그리고 x,y,result변수를 각각 선언해주고, Excep클래스의 객체를 생성해줍니다.
try문에 10/0을 해주고 출력하려하니 에러가 발생합니다. 0으로 나눌수없기에 나눌수없습니다라는 문구가 출력되고,
finally에서 무조건 실행할 코드 문구출력후, 종료하는 문구가 출력됩니다.
즉, finally은 무조건 마지막에 출력해주는 것이기에 try-catch를 작성하고 마지막에 이건 실행을 하고 끝내라 라느 의미입니다.
(여기서 Exception은 모든 에러 발생입니다.)

 

 

 

 

 

 

import java.util.Scanner;

public class Test {

	public static void main(String[] args) throws IOException {
		int num;
		System.out.println("한자리 수 입력:");
		num = System.in.read()-48;
		System.out.println("입력한 값 : " +num);
	}
}

 

 

 

* 예외전가 (throws)
예외전가는 try-catch해도되지만, 그냥 catch없이 에러발생시 예외를 전가하는것입니다.
즉, 그냥 에러발생하면 그에러는 던져버린다는 의미?라고 생각하면 됩니다.
위소스에서 num = System.in.read()-48;가 에러가 뜨는데 throws IOException을 적음으로인해 예외전가가되서
실행이 되는것을 확인할수있습니다.