Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

예외 처리 본문

프로그래밍 언어/Java

예외 처리

세레프 2023. 5. 5. 22:34

 프로그램을 실행을 하다가 하드웨어의 오작동이나 고장으로 인한 오류, 잘못된 코딩, 잘못된 입력으로 인해 발생하는 오류가 발생하는 경우가 있는데, 발생하는 오류 중에서 잘못된 코딩, 잘못된 입력으로 인한 발행하는 오류 예외라고 한다. 그리고 예외는 예외처리를 통해 프로그램 실행하는 중에 처리가 가능하다.

 

 자바에서는 예외를 클래스를 통해 관리가 된다. 프로그램이 실행이 되는 도중에 예외가 발생하면 JVM은 해당 예외 클래스를 객체로 생성한다. 

 이때, 모든 예외클래스들은 Exception클래스를 상속받기에, Exception클래스을 통해 모든 예외클래스를 처리할 수 있으며, Exception은 Object클래스와 Throwable클래스를 상속받기 때문에, 모든 클래스는 "getMessage(), toString(), printStackTrace()"같은 클래스안에 정의되어 있는 메서드를 사용할 수 있다.

예외 설명
ArithmeticException 실행 중에 수학적으로 오류가 발생하는 경우
ArrayIndwxOutOfBoundsException 실행 중에 배열에서 인덱스 범위를 초과하는 경우
NullPointerException 실행 중에 참조변수의 값이 NULL인 상태에서 객체 접근 연산자를 사용하는 경우
package pack0506;

public class Code1 {

	public static void main(String[] args){
		int a = 0;
		int b = 2;
		try {
			int c = b/a;
		}
		catch(Exception e) {
			e.printStackTrace(); //예외 정보 출력
		}
	}
}

 예외에는 "RuntimeException클래스"의 하위 클래스가 아닌 일반예외와  "RuntimeException클래스"의 하위 클래스 실행예외로 나뉜다.

 일반 예외 예측 되는 예외에 대한 예외처리코드가 있어야 하는 예외로, 컴파일하는 과정에서 해당 예외처리코드의 유무를 확인하는 컴파일러 체크 예외이다. 그래서 개발자가 해당 예외를 수정하도록 IDE가 유도한다.

 반면, 실행 예외 실행 도중에 발생할 수 있는 예외로, 예측이 불가능하기에 예외 처리코드의 유무를 확인하지 않는 컴파일러 None 예외이다.

 

try-catch-finally 코드

 자바에서는 예외를 객체로 생성하며, 생성된 객체는 try-catch문을 통해 예외 처리을 한다. 즉, try-catch-finally 코드예외 발생시, 해당 예외에 대해서 처리하기 위해 자바에서 제공하는 예외처리 문법으로, 다음과 같은 구조로 작성된다.

  try{

예외가 발생할 수 있는 명령

}
catch(발생할 수 있는 예외 클래스 변수){

예외 발생시 실행할 명령;

}
finally{

예외가 발생하든 안하든 무조건 실행하는 명령;

}
 

 이때 catch의 예외 클래스타입은 try 블록에서 발생되는 예외의 종류이거나 모든 예외 클래스의 부모클래스인 "Exception"클래스이며, 아래의 조건에 따라 실행된다.

  •  try 블록에 있는 명령들이 실행
    1. try 블록에서 예외가 발생하지 않는 경우, catch 블록의 명령은 실행되지 않고 finally 블록의 명령어를 실행
    2. try 블록에서 예외가 발생할 경우, catch 블록에 있는 명령을 실행하고 finally 블록의 명령어를 실행 
  • finally 블록은 생략이 가능하며, try 블록이나 catch 블록에 return문을 사용하더라도 finally 블록은 항상 실행

 

 try 블록 내부에는 여러개의 예외가 발생할 수 있기에 catch 블록도 여러개 작성할 수 있다. 하지만 같은 예외 클래스는 중복적으로 선언할 수 없으며, catch 블록이 여러 개가 있을지라도 하나의 catch 블록만 사용한다. 즉, 가장 먼저 발생한 오류의 클래스를 가진 catch 블록만 실행이 된다. 

package pack0505;

public class Code2 {

	public static void main(String[] args) {
		try {
			int a[] = {2,0};
			int b = 4;
			int c=b/a[2]; //배열의 인덱스가 0,1
			int d = b/a[1];
			System.out.println(c);
		}
		catch(ArithmeticException e){
			System.out.println("산술 오류 발생");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("배열 오류 발생");
		}

	}
}

 이러한 try-catch-finally 코드는 파일의 데이터를 프로그램에 호출하거나 프로그램의 데이터를 파일에 저장(파일 입출력) 할 때 사용된다.

 파일과 프로그램간의 연결망(스트림(stream))을 열었다면 오류가 발생하더라도 마지막엔 항상 닫아줘야 한다. 그래서 해당 finally문을 사용해야 한다.

package pack0505;

public class Code3 {

	public static void main(String[] args) {
		int a=0;
		int b=2;
		try {
			System.out.println("외부 접속");
			int c = b/a;
			}
		catch(ArithmeticException e) {
			System.out.println("오류발생");
			
		}
		finally {
			System.out.println("연결 해제");
		}
	}
}

'프로그래밍 언어 > Java' 카테고리의 다른 글

API와 Object 클래스  (0) 2023.05.11
예외 떠넘기기  (0) 2023.05.06
익명 객체  (0) 2023.05.03
중첩 클래스  (0) 2023.05.02
인터페이스  (0) 2023.04.20
Comments