티스토리 뷰

프로그래밍을 하다 보면 빨간 줄이 죽죽 그어있고 돌렸는데 에러가 나고 하는 경우가 많다. 이 에러들의 종류와 어떻게 처리할 것인지에 대해 정리해보고자 한다!

 

발생 시점에 따른 에러(Error)의 구분

 

컴파일 에러 : 소스코드 컴파일 시에 발생한다. 주로 문법적인 에러이며 코드를 수정해야 한다.

ex) ’;’ 이 누락 , {} 괄호가 맞지 않는 등의 구문 에러 

 

● 런타임 에러 : 프로그램 실행 중에 발생한다. 수행할 수 없는 작업을 시도할 경우에 발생하며 코드를 수정해야 한다.

ex) 값이 없어서 읽어올 수 없는 경우(NullPointerException) , 무한루프 , 0으로 나누는 경우(ArithmeticException) 등

 

 시스템 에러 : 컴퓨터 시스템상의 에러로 소스코드로는 해결할 수 없는 장비 또는 os 관련 에러이다.

 

 

예외(Exception)

: 프로그램 실행 도중 발생하는 것으로 에러 메시지를 표시하고 중단된다. 그러므로 예외는 런타임 에러에 속한다. 예외는 여기서 또 Checked Exception , Unchecked Exception 2가지로 나눠진다.

 

→구체적으로 나누자면 이렇게 되고 보편적인 의미로 에러"소스코드로 해결할 수 없는" 예외"소스코드 수정으로 처리가 가능한"으로 구분된다.

 

Checked Exception : RuntimeException을 상속하지 않는 클래스로 소스코드 상에서 반드시 처리해줘야 한다.

 

Unchecked Exception : RuntimeException을 상속하는 클래스로 소스코드 상에서 처리하지 않아도 된다.

 

Exception 계층도

+흔히 발생하는 IndexOutOfBoundsException도 Unchecked Exception에 포함된다.

 

 

Checked Vs Unchecked Exception

 

 

 

예외처리(Exception Handling) 

이제 Exception을 다루는 방법을 알아보자. 예외처리의 기본 구문은 try~catch~finally이다. 이걸 통해 발생하는 코드에 대해 직접 처리해 주기도 하고 throws를 통해 이전 호출 위치에서 처리하도록 넘기는 방법이 있다. 

 

우리는 이 Exception클래스를 상속받아 직접 예외 클래스를 만들기도 발생시키는 것 역시 가능하다.

 

try{
	//예외 발생 가능성이 있거나, 예외를 반드시 처리해야하는 코드 작성부
}catch(처리할 예외 클래스명 객체 1){
	//예외 상황 1에 대한 처리코드
}catch(처리할 예외 클래스명 객체 2){
	//예외 상황 2에 대한 처리코드
}
...
finally{
	//예외가 발생하던 안하던 반드시 실행되는 코드
}

기본적인 예외 처리 방식은 이렇게 된다. 이제 코드로 몇 가지의 예외처리 방법을 알아보자! finally는 사용을 안해도 무방하다.

 

 

 

 

 

 

먼저 코드에서 예외를 직접 처리해주는 방식이다.

public static void main(String[] args) {
try {
			//예외가 발생할 수 있는 구문
			
			Scanner sc = new Scanner(System.in);
			System.out.print("정수1 : ");
			int num1 = sc.nextInt();
			System.out.print("정수2 : ");
			int num2 = sc.nextInt();
			
			int result = num1 / num2;
			System.out.printf("%d/%d=%d%n", num1, num2, result);
			
			
		} catch (InputMismatchException e) {
			System.out.println("경고 >> 정수값만 입력하셔야 합니다.");
		} catch (ArithmeticException e) {
			System.out.println("경고>> 정수2는 0일수 없습니다.");
		} catch (Exception e) {
			//다형성 적용 : 상속관계에 예외클래스를 나열할때는 자식 - 부모 순서여야한다.
			System.out.println("모든 예외객체를 처리하는 구문입니다!!!!");
		}
 }

여기서 생기는 Exception에는 2가지를 명시하여 나타낼 수 있다. 정수 값만 입력했는지와 0으로 나누는지 try에서 발생한 예외를 catch에서 잡아서 처리해주는 코드이다. 여기서는 print문으로 오류의 이유를 설명하고 있다.

 

여기서 중요하게 살펴볼 점은 catch의 Exception 순서! 만약 Exception e를 catch 줄 가장 위쪽에 쓴다면 컴파일 에러가 난다. 모든 예외가 Exception을 상속하므로 여기서 다 걸리기 때문에 아래쪽에서 ArithmeticException e는 실행될 수 없기 때문이다. 그러므로 여러 개의 catch문을 작성할 때는 최하위 후손 클래스부터 기술해주기!

 

 

 

 

다음으로는 thorws를 통해 예외를 위임하는 예를 살펴보자 위임에는 예외처리를 직접 하지 않고 던지는 것직접 예외처리 후 사용자 정의 예외 클래스를 통해 예외를 다시 던지는 것 두 가지의 방법이 있다.

 

아래 코드로 간단하게 살펴보자.

 

-실행 클래스 Run.java

public class Run {

	public static void main(String[] args) {
		new Run().test();
	}
	
	public void test() {
		Scanner sc = new Scanner(System.in);
		System.out.print("문자열을 입력하세요 : ");
		try {
			String s = sc.nextLine();
			
			CharacterProcess cp = new CharacterProcess();
			System.out.println(cp.countAlpha(s));
			
		} catch (CharCheckException e) {
			//에러메세지만 출력!
			System.out.println(e.getMessage());
		} 
		
		
	}
}

 

-예외를 발생시키고 던지는 클래스. CharacterProcess.java

public class CharacterProcess {
	
	public int countAlpha(String s) throws CharCheckException {
		if(s.indexOf(" ") > -1)
			throw new CharCheckException("체크할 문자열 안에 공백 포함할 수 없습니다.");
		int cnt = 0;
		for(int i=0; i<s.length(); i++) {
			if(Character.isUpperCase(s.charAt(i)) || Character.isLowerCase(s.charAt(i)))
				cnt++;
		}
		return cnt;
	}
	
	
}

 

-사용자 정의 예외 클래스. CharCheckException.java

public class CharCheckException extends Exception {
	
	public CharCheckException(String msg){
		super(msg);
	}
	
}

 

 

실행 순서

1. try에서 실행 클래스에서 공백이 포함된 문자열을 입력 -Run.java

2. CharacterProcess 클래스 객체에 담겨 countAlpha() 실행 - CharacterProcess.java

3. 공백이 포함되어 있으므로 미리 정의된 예외 클래스를 이용해 예외를 발생시킴 -CharacterProcess.java

4. 사용자 정의 예외 클래스에서 생성자 인자로 받은 msg를 부모 생성자를 통해 전달 여기서 getMassge()를 부를 경우 msg에 해당하는 내용이 나오게 됨 - CharCheckException.java

5. 해당 메서드에서 처리하는 게 아닌 throws를 통해 실행 메서드를 부른 곳으로 돌아감 -CharacterProcess -> Run

6. catch에서 CharCheckException으로 걸려서 에러 메시지를 표시하게 됨 -Run.java

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코드가 복잡해질수록 다양한 예외가 나올 수 있으니 알맞게 알맞은 상황에서 예외를 처리하는 방법을 익혀야겠다!

 

참고자료

https://madplay.github.io/post/java-checked-unchecked-exceptions

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함