[ch8-1]
컴파일러가 하는 일
1. 구문체크 (문법에 맞는지)
2. 번역 잘 되는지
3. 최적화 → 간단한 계산 같은 건 알아서 해줌
4. 생략한 코드들 추가해줌 (extends Object 같은거)
예외처리(exception handling)
IOException
: 입출력 예외
ClasNotFoundException
: 클래스 파일이 존재하지 않을 때
ArithmeticException
: 산술계산 예외
ClassCastException
: 형변환 예외
NullPointerException
: 널 포인트 에외(가리키는 객체가 아무것도 없음)
indexOutOfBoundException
: 배열 길이 벗어났을 때
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
참고: if문과 달리 try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호{ } 를 생략할 수 없다.
① try 블럭 내에서 예외가 발생한 경우,
1. 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
2. 일치하는 catch 블럭을 찾게되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다.
만일 일치하는 catch블럭을 찾이 못하면, 예외는 처리되지 못한다.
② try 블럭 내에서 예외가 발생하지 않은 경우,
1. catch 블럭을 거치지 않고 전체 try-catch 문을 빠져나가서 수행을 계속한다.
- 예외가 발생하면, 이를 처리할 catch 블럭을 찾아 내려간다.
- Exception이 선언된 catch 블럭은 모든 예외처리를 담당한다. 따라서 마지막 catch 블럭에 선언해줘야한다.
0으로 나누는게 허용이 안되므로 예외발생! 내가 착각했던 점은 예외가 발생해도 일단 try문을 다 시행하는게 아니라 발생한 그 순간부터 catch 문으로 이동한다는것 ! 따라서 2는 안찍힌다.