프로그램 에러
- 컴파일 에러 (compile - time error) : 컴파일 할 때 발생하는 에러
- 런타임 에러(runtime error) : 실행 할 때 발생하는 에러
- 논리적 에러(logical error) : 작성 의도와 다르게 동작
- java 런타임 에러
에러 (error) 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 (exception) 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
-예외처리의 정의와 목적
정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는것
목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것
Object : 최고 조상
Throwable : 클래스,모든 오류의 조상
Excetion , Error : 미약한 오류 , 심각한 오류 => 둘다 런타임 오류
Exception 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외
1. Exception 클래스 (일반예외, 컴파일러체크예외)
- 자바 소스를 컴파일하는 과정에서 예외 처리코드가 필요한지 검사
- 예외처리코드가 없다면 컴파일 오류가 발생
2. Runtime Excetption (실행예외)
- 컴파일 과정에서 예외 처리코드를 검사하지 않은 예외
- 컴파일 시 예외처리를 확인
▶ 자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다. 그리고 나서 예외처리코드에서 예외 객체를 이용할 수 있도록 한다.
예외 처리하기 try-catch 문
try { //예외가 발생할 가능성이 있는 문장들을 넣는다. } catch(Exception1 e1) { //Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다. } catch(Exception2 e2) { //Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다. } catch(Exception3 e3) { //Exception3이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다. }
▶ if문과 달리, try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호{} 를 생략할 수 없다.
try-catch 문 흐름
1. try블럭 내에서 예외가 발생한 경우
발생한 예외와 일치하는 catch 블럭이 있는지 확인
일치하는 catch 블럭을 찾게되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면 , 예외는 처리되지 못한다.
2. try블럭내에서 예외가 발생하지 않은 경우
catch블럭을 거치지 않고 전체try-catch문을 빠져나가서 수행을 계속한다.
1. try블럭 내에서 예외가 발생한 경우
public static void main(String args[]) {
System.out.println(1);
try{
System.out.println(0/0); //0나누기 예외발생
System.out.println(2);
}catch ( ArithmeticException as) {
System.out.println(3);
} //try - catch의 끝
System.out.println(4);
}
}
2. try블럭내에서 예외가 발생하지 않은 경우
public static void main(String args[]) {
System.out.println(1);
try{
System.out.println(2);
System.out.println(3);
}catch( Exception e){
System.out.println(4);
} //try-catch 끝
System.out.println(5);
}
}
예외정보 얻기
printStackTrace() 예외 발생당시의 호출스택(Call Stack) 에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
try {
//예외 객체 생성
} catch (예외클래스 e) {
//예외가 가지고 있는 Message 얻기
String message = e.getMessage();
//예외의 발생 경로를 추적
e.printStackTrace();
}
예외 메시지는 catch블럭에서 getMessage() 메서드의 리턴값(string타입)으로 얻을 수 있다.
printStackTrace() : 예외발생코드를 추적해서 모두 콘솔에 출력한다. 어떤 예외가 어디에서 발생했는지 상세하게 출력해주기 때문에 프로그램을 테스트하면서 오류를 찾을 때 활용한다.
public class AccountExample {
public static void main(String[] args) {
Account account = new Account();
//예금하기
account.deposit(10000);
System.out.println("예금액:" + account.getBalance());
//출금하기
try{
account.withdraw(30000);
} catch (BalanceInsefficientException e) {
String message = e.getMessage(); //예외 메시지 얻기
System.out.println(message);
System.out.println();
e.printStackTrace(); //예외 추적후 출력
}
}
}
실행결과
BalanceInsefficientException: 잔고부족:20000모자람
경로 ---
AccountExample 클래스는 Account 클래스를 이용해서 예금과 출금을 한다. 출금할 때 withdraw() 메서드를 사용하므로 예외처리가 필요하다. 예외 처리 코드에서 BalanceInsefficientException 객체의 getMessage() 메서드와 printStackTrace메서드로 예외에 대한 정보를 얻고 있다.
AccountExample 클래스를 실행하면 위의 실행결과가 나온다. "잔고부족: 20000 모자람" 은 getMessage() 메서드의 리턴값을 출력한 것이다.
'java' 카테고리의 다른 글
[JDBC] PreparedStatement (0) | 2021.11.20 |
---|---|
날짜와 시간 ,Calendar 클래스 (0) | 2021.11.11 |
java_17_스레드(2) (0) | 2021.11.02 |
java_6_패키지 (0) | 2021.11.02 |
java_6_final (0) | 2021.11.02 |