JAVA_예외처리(exception_handling)(1)

호근·2022년 12월 13일
0

java

목록 보기
28/35

프로그램이 오동작하거나 비정상적으로 종료되는 경우가 있다.
이런 경우를 에러 또는 오류라고 한다.

에러의 종류

컴파일 에러

  • 컴파일 시 발생하는 에러

런타임 에러

  • 실행 시 발생하는 에러

논리적 에러

  • 실행은 되지만 의도와 다르게 작동하는 것

자바는 실행 시 발생할 수 있는 오류를 두 가지로 구분하였다.
에러와 예외이다.

에러는 메모리부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구될 수 없는 심각한 오류이다.

반면 예외는 발생하더라도 수습이 가능하다.

예외클래스

자바는 실행 시 발생할 수 있는 모든 오류(Exception과 Error)를 클래스로 정의하였다.
Exception클래스와 Error클래스는 Object의 자손이다.

모든 예외의 최고 조상클래스는 Exception 클래스이다

Exception
	- IOException
    - ClassNotFoundException
    - ...
    - RuntimeException
    	- ArtithmeticException
        - ClassCastException
        - NullPointerException
        - ...
        - IndexOutOfBoundsException

try-catch문

표현법은 다음과 같다.

try{
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch(Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 코드 작성
} catch(Exception2 e2) {
	// Exception2이 발생했을 경우, 이를 처리하기 위한 코드 작성
} catch(Exception3 e3) {
	// Exception3이 발생했을 경우, 이를 처리하기 위한 코드 작성
}

try-catch 예문

public static void main(String[] args) {
		int number = 100;
		int result = 0;
		
		for (int i = 0; i < 10; i++) {
			try {
				result = number / (int)(Math.random()*10);
				System.out.println(result);
			} catch (ArithmeticException e) {
				System.out.println("0");
			}
			
			
			
		}
	}

for 문이 돌아가며 랜덤한 수를 반환할 때
정수인 number를 0으로 나누면 발생될 에러를 ArithmeticException으로 처리가능한 것을 확인했다.

실행순서(흐름)

try-catch문에서 예외가 발생한 경우와 발생하지 않는 경우는 서로 실행순서가 다르다.

try블럭 내에서 예외가 발생한 경우

  • 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
  • 일치하는 catch블럭을 찾으면, catch블럭 내의 코드를 실행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속 실행한다. 만일 일치하는 catch블럭이 없으면 예외는 처리되지 못한다.

try블럭 밖에서 예외가 발생한 경우

  • catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

catch블럭

catch블럭은 예문에서 보았듯이
(){} 소괄호와 중괄호로 구성된다.

예외가 발생하면 발생된 예외 클래스의 인스턴스가 생성된다.
예외가 발생한 문장이 try블럭에 포함되어있다면,
해당 예외를 처리할 수 있는 catch블럭을 찾게된다.

첫번째 catch블럭부터 차례로 일치여부를 따져가면서 catch블럭 내에 선언된 참조변수와 생성된 예외클래스의 인스턴스에 instanceof연산자를 사용하여 비교하는데,
검사가 true인 catch블럭을 만날 때 까지 계속된다.

true인 블럭이 하나도 없으면 예외는 처리되지 않는다.

소괄호에는 예외클래스 타입의 참조변수가 선언되어야한다.

만약 catch블럭의 괄호에 Exception 클래스 타입의 참조변수를 선언해놓으면
해당 catch블럭은 모든 종류의 예외에 대해서 처리한다.

Exception 클래스는 모든 예외클래스의 조상이기 때문이다.

printStackTrace()와 getMessage()

예외 발성시 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨있다.
printStackTrace()와 getMessage()메서드를 통해 이 정보들을 얻을 수 있다.

	public static void main(String[] args) {
		System.out.println(1);
		System.out.println(2);
		try {
			System.out.println(3);
			System.out.println(0/0); // 예외발생
			System.out.println(4); // 실행되지 않음
		} catch (ArithmeticException ae) {
			System.out.println("예외메시지 :" + ae.getMessage());
		}System.out.println(6);
	}
실행결과
1
2
3
예외메시지 : by zero
6

예외 발생시키기

키워드 throw를 사용하여 직접 예외를 발생시킬 수 있다.

  1. 발생시키려는 예외클래스의 객체 생성
  2. throw를 이용하여 예외를 발생
public static void main(String[] args) {
		
		try {
			Exception e = new Exception("고의로 발생시킴");
			throw e; // 예외를 던져줌
		} catch(Exception ce) {
			System.out.println("ExceptionType :"+ ce.getMessage());
			ce.printStackTrace();
		} System.out.println("프로그램 정상종료");
		
		
		
	}
실행결과
ExceptionType :고의로 발생시킴
java.lang.Exception: 고의로 발생시킴
	at XXXXXXXX.com.mc.exceptionhandling.PracticeThrow.main(PracticeThrow.java:8)
프로그램 정상종료

메서드에 예외 선언하기

메서드에 예외를 선언하려면 선언부에 throws를 사용해서 메서드 내에서 발생될 수 있는 예외를 적어주면된다.

void method() throws Exception1, Exception2, Exception3, Exception4{
	. . .
}

위와같이 구현하며 여러 예외를 사용할 땐 쉼표로 구분한다.

profile
22.11.28 ~

0개의 댓글