카테고리 없음

예외 처리

나주나주 2024. 1. 3. 10:29

오류 발생 시 프로그램 종료 → 웹에서 일어나면 안되는 일!

 

예외 처리 Exception Handling

: 프로그램에서 예외 발생 시 프로그램의 갑작스러운 종료를 막고 처리하는 코드

 

일반 예외 Exception

: 컴파일러 체크 예외

클래스 설명
IOException 입출력과 관련된 예외 발생
ClassNotFoundException jar 또는 calss파일이 없을 때, 상속 형태 문제
SQLException JDBC에서 쿼리를 실행하거나 생성할 때 발생
InterruptException 인터럽트를 받는 스레드가 블로킹될 수 있는 메서드 ex)thread.interrupt() 등을 사용했을 때

 

실행 예외 Runtime Exception

: 컴파일러가 예외처리 코드를 검사하지 않는 예외

클래스 설명
RuntimeException 실행 시간에 예외 발생
ArithmeticException 0으로 나눌 경우
NullPointerException null을 가지고 있는 객체 호출 시 (객체가 생성 되지 않았을 수도 있음!)
NumberFormatException 문자열을 숫자로 변환할 때
IndexOutOfBoundException 인덱스가 범위를 벗어날 때
ArrayIndexOutOfBoundsException 인덱스가 배열의 크기보다 크거나 음수일 때
StringIndexOutOfBoundException 문자열 인덱스의 범위를 벗어날 때

 

Tip) 예외는 java.lang.Exception 클래스를 상속

Exception클래스의 주요 메서드

메서드 설명
getMessage() 요약된 메시지
getCause() 원인을 Throwable 객체 형태로 반환
toString() 예외 메세지에 추가된 문자열의 이름이 포함된 문자열 반환
printStackTrace() log 출력
getStackTrace() log 반환
fillinStackTrace() Throwable 객체 반환

 

try

: 예외 발생 코드 지정, 단독 사용 불가

 

catch

: 예외 발생 처리 블럭

 

finally

: 프로그램에서 꼭 필요한 코드를 실행하는 데 사용, 예외 처리 여부에 관계 없이 실행

 

 

다중 catch

try {
	// 예외 코드 발생 
} catch (ArrayIndexOutOfBoundsException e){
	// 발생되는 예외별로
}catch (IOException e) {
	// 처리 코드를 다르게 한다
}

 

멀티 catch

try {

} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
	//여러 개의 예외를 처리할 수 있도록 |(pipe)로 연결한다
}

 

 

throw

: 예외 고의 발생

 

throws

: 자신을 호출한 상위 메서드로 오류를 던짐

 

 

사용자 지정 예외

직접 예외를 만들어 상황에 따라 코드를 처리할 수 있다.

 

//기본 생성자 (필수)

//사용자 지정 생성자 (필수, 메세지 전달 용도)

package ch10.client_exception;

public class NotExistIdException extends Exception{ // id 유무 판단 예외 처리
	//login()에서 존재하지 않는 아이디가 있을 때
	
	//기본 생성자 (필수)
	public NotExistIdException() {}
	//사용자 지정 생성자 (필수, 메세지 전달)
	public NotExistIdException(String message) {
		super(message);
	}
}
package ch10.client_exception;

public class WrongPasswordException extends Exception{ // id 유무 판단 예외 처리
	//비밀번호가 일치하지 않을 때
	
	//기본 생성자 (필수)
	public WrongPasswordException() {}
	//사용자 지정 생성자 (필수, 메세지 전달)
	public WrongPasswordException(String message) {
		super(message);
	}
}
package ch10.client_exception;

import java.util.Scanner;

public class LoginExam {
	public static void main(String[] args) {
		// id와 pw를 검증하여 예외 처리
		Scanner in = new Scanner(System.in);
		System.out.println("id를 입력하세요.");
		System.out.print(">> ");
		String id = in.next();
		System.out.println("pw를 입력하세요.");
		System.out.print(">> ");
		String pw = in.next();

			try {
				login(id, pw); //예외 발생 코드
				System.out.println("로그인 성공!" + id + "님 환영합니다.");
			} catch (NotExistIdException | WrongPasswordException e) { 
				System.out.println(e.getMessage());
			}
	}

	private static void login(String id, String pw) throws NotExistIdException, WrongPasswordException {
		if (!id.equals("hgd")) { //false일 경우 ㅡㅡ
			throw new NotExistIdException("아이디가 존재하지 않습니다.");
		}
		if (!pw.equals("1234")) {
			throw new WrongPasswordException("패스워드가 다릅니다.");
		}
	}
}

 

 

try-with-resouces

: 리소스 객체(ex) 입출력 스트림, 서버 소켓, 각종 채널의 close() 메서드를 호출하여 안전하게 리소스를 닫아준다

package ch10.try_catch;

public class TryWith implements AutoCloseable { //내장된 자동 종료 인터페이스 구현 객체 상속
	// 필드
	private String file; // 파일명

	// 생성자
	public TryWith(String file) {
		this.file = file; // 객체 생성 시 파일명을 전달 받아 file필드에 넣음
	}
	// 메서드
	public void read() {
		System.out.println(file + "을 읽습니다.");
	}
	
	@Override //인터페이스의 추상 메서드 재정의
	public void close() throws Exception {
		System.out.println(file + "을 닫습니다.");
	}
}
package ch10.try_catch;

public class TryWithExam {
	public static void main(String[] args) {
			//리소스 블럭
		try (TryWith file = new TryWith("text.txt")) {
			file.read();
			throw new Exception(); //강제적 예외 발생
		} catch (Exception e) {
			System.out.println("예외 처리 코드가 실행되었습니다.");
		}
	}
}

 

 

resource

:데이터를 읽고 쓰는 객체