본문 바로가기

순이코딩/Java

[Java] try-catch문을 이용한 예외처리, finally문

728x90
반응형


 

에러(예외)의 구분은 발생시점에 따라 크게 2개의 에러로 구분할 수 있습니다. 먼저 컴파일 에러는 컴파일 시, 그러니까 실행 전 발생하는 에러 입니다.

컴파일 오류 예시

컴파일 에러는 이렇게 빨간 줄이 그어지고 에러가 난 이유, 해결하는 방법을 제시(무조건 하지는 않음) 하기 때문에 사전에 에러를 수정할 수 있습니다.

이와 달리 런타임 에러프로그램 실행 도중 발생하는 에러로 개발자가 코드를 뜯어보며 눈치채지 못하지 않는 이상은 눈에 띄지 않습니다.

프로그램 실행 중 에러가 발생하는 건 어쩔 수 없는 일이지만 개발자가 이에 대한 처리를 미리 해주어야 합니다. 이를 예외처리라고 합니다.

예외발생(에러)으로 인한 비정상 종료를 막고 정상실행상태를 유지하기 위해 예외처리가 필요합니다. 

try {
 //예외발생할 가능성이 있는 문장 
}catch(Exception e) {
 //Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
 }

try-catch의 구조는 이렇습니다.

try문 안에 있는 문장에서 예외가 발생한 경우 발생한 예외와 일치하는 catch문의 조건이 있는지 확인합니다. 있다면 catch문의 문장을 실행하고 try-catch문을 벗어나 그다음 문장을 실행합니다. catch문의 조건과 발생한 예외가 일치하지 않으면 에러가 발생합니다.

finally문은 try문 안의 일과 관계 없이 문장을 실행합니다.

예를 들어 JDBC를 사용하는 경우를 보겠습니다.

		try {
			// 1. 동적로딩 Class.forName();
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB 연결(Connection 객체 생성)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "SERVICE";
			String db_pw = "12345";

			conn = DriverManager.getConnection(url, db_id, db_pw);

			// 3. SQL문 작성 및 전송(PreparedStatement 객체)
			String sql = "insert into MEMBER values(?, ?, ?, ?)"; // 바인딩 변수 : ?
			psmt = conn.prepareStatement(sql);

			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);
			psmt.setInt(4, age);

			cnt = psmt.executeUpdate();

		} catch (ClassNotFoundException e) {
			System.out.println("동적 로딩 실패");
		} catch (SQLException e) {
			System.out.println("SQL 실패");
		} finally {
			// 4. 통로 닫아주기, 자원 반납하기
			try {
				psmt.close();
				conn.close();
			} catch (SQLException e) {
				System.out.println("SQL 실패");
			}

코드 전체 중 try-catch-finally 부분만 가져왔습니다.

물론 지금 여기서는 에러가 없지만 만약 1, 2 단계에서는 에러가 없이 넘어갔는데 이후에 에러가 발생하면 동적 로딩을 하고 DB연결한 상태로 비정상적인 종료가 됩니다. 그렇기 때문에 finally를 사용해 만약 에러가 발생하더라도 그것과는 관계없이 자원 반납하는 코드는 실행하도록 합니다.

이렇게 중간의 에러에도 불구하고 다음 코드가 실행되게 하기 위해 finally를 사용합니다.

728x90
반응형