에러와 예외(Error & Exception)
에러가 발생하면 프로그램의 비정상적인 종료를 막을 수 없지만, 예외는 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.
Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외
예외처리의 정의와 목적
정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것
try{
//예외가 발생할 가능성이 있는 문장들을 넣는다.
}
catch(Exception1 e1){
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
catch(Exception2 e2){
// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
try-catch문에서의 흐름
try 블럭 내에서 예외가 발생한 경우
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2. 일치하는 catch블럭을 찾으면, 그 catch 블럭의 문장들을 수행하고 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 없다면 예외는 처리가 되지 않는다.
try블럭 내에서 예외가 발생 하지 않은 경우
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
PrintStackTrace()와 getMessage()
printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage() :발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
try{
Sysyem.out.println(0/0); 예외 발생!!!
}
catch(ArithmeticException e){
e.printStackTrace(); // ArithmeticException 에외메시지 출력
System.out.println("예외메시지:" +e.getMessage());
}
연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시킴");
키워드 throw를 이요해서 예외를 발생시킨다.
throw e;
public class ExceptionEx {
public static void main(String[] args) {
try {
Exception e = new Exception("고의로 발생시켰음");
throw e;
// throw new Exception("고의로 발생시켰음");
} catch (Exception e) {
System.out.println("에러메시지 : " + e.getMessage());
e.printStackTrace();
}
System.out.println("프로그램이 정상 종료되었음");
}
}
예외를 발생시키는 키워드
throw
와 예외를 메서드에 선언할 때 쓰이는throws
를 잘 구별하자
public class Ex8_9 {
public static void main(String[] args) throws Exception {
method1();
}
static void method1() throws Exception{
method2();
}
static void method2() throws Exception{
throw new Exception();
}
}
예외를 메서드의 throws에 명시하는 것은 예외를 처리하는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것이다.
제일 마지막에 있는 main메서드에서도 예외가 처리되지 않으면, main메서드마저 종료되어 프로그램이 전체가 종료된다.
사용목적: 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적
try{
// 예외가 발생할 수 도 있는 문장
}catch(Exception e1){
//예외처리를 위한 문장
}finally{
//예외의 발생여부와 상관없이 항상 수행되어야할 문장들을 넣는다.
//제일 마지막에 finally가 와야한다.
}
기존의 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다.