오류 발생 시 프로그램 종료 → 웹에서 일어나면 안되는 일!
예외 처리 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
:데이터를 읽고 쓰는 객체