컴파일 에러 : 컴파일할 때 발생하는 에러
런타임 에러 : 실행할 때 발생하는 에러
논리적 에러 : 작성 의도와 다르게 동작
에러 error
: 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 exception
: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
Exception클래스와 그 자손들
Exception - IOException(입출력예외)/ ClassNotFoundException(클래스못찾음)/.../RuntimeException
사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
checked : ✨예외처리가 필수! 컴파일 에러
RuntimeException클래스와 그 자손들
RuntimeException - ArithmeticException(산술계산)/ ClassCastException(형변환)/ NullPointerException(널포인터)/... IndexOutOfBoundsException(범위벗어남?)
프로그래머의 실수로 발생하는 예외
unchecked : 예외처리가 선택! 컴파일 OK, ✨but 비정상종료
try { //예외가 발생할 가능성이 있는 문장들 } catch (Exception1 e1) { //Exception1이 발생했을 경우, 이를 처리하기 위한 문장 } catch (Exception2 e2) { //Exception2이 발생했을 경우, 이를 처리하기 위한 문장 } catch (ExceptionN 참조변수) { //Exception1이 발생했을 경우, 이를 처리하기 위한 문장 }
대괄호 생략 불가
예외 발생
-> catch{}
을 찾아 내려감
-> 그래서 예외가 발생하면 예외 다음 문장은 실행되지 않는다!
일치하는 catch{}
이 없으면 예외 처리 안됨!
✨(Exception e)
이 선언된 catch블럭
catch(Exception e){...}
로 하기!!
public class Ex8_02 {
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(3/0);
System.out.println(2); //예외발생하면 다음문장 넘어감
} catch (ArithmeticException ae) {
System.out.println(4);
}
System.out.println(5);
}
}
1
4
5
예외 발생
해당 예외 객체 생성(예: ArithmeticException
객체 생성)
그 객체 안에는 예외 정보(메소드 등)가 들어있다.
1) printStackTrace()
2) getMessage()
...
catch (예외타입 참조변수)
에서 참조변수ae
가 그 객체(ArithmeticException
)를 가리킴
참조변수의 타입(예외타입
)이 그 객체(ArithmeticException
)랑 일치하면 해당 catch{}
실행
우리는 참조변수
와 3번의 메소드들을 사용해 객체에 담긴 예외정보를 다룰 수 있다.
1) ae.printStackTrace();
2) ae.getMessage();
발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
타입 : String
public class Ex8_04 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(3/0); //AE
System.out.println(4); //실행 안함
} catch (ArithmeticException ae) {
if(ae instanceof ArithmeticException) { //*****
System.out.println("true");
}
System.out.println("ArithmeticException");
ae.printStackTrace();
System.out.println(ae.getMessage());
} catch (Exception e) { //AE 제외하고 모든 예외, 제일 마지막
System.out.println("Exception");
}
System.out.println(6);
}
}
java.lang.ArithmeticException
: 오류 종류(클래스)/ by zero
: 0을 나눠서 오류at Ex8_04.main(Ex8_04.java~:9)
: 해당 소스파일의 main함수의 (맨위에서) 9번째 줄에서 오류
public class Ex8_05 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(3/0);
System.out.println(4);
} catch (ArithmeticException ae) {
ae.printStackTrace();
System.out.println("예외메세지 : "+ae.getMessage());
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(6);
}
}
내용이 같은 catch블럭들을 하나로 합친 것(중복제거)
부모-자식 관계의 블럭은 X
두 블럭의 공통멤버만 사용 가능