우리가 흔히 말하는 컴파일 오류와 예외는 엄연히 다른 것.
컴파일 오류는 문법에 맞지 않게 작성되어서 컴파일할 때 오류로 발견되는 것이고
예외는 오동작이나 결과에 악영향을 미칠 수 있는!! 실행 중에!!!! 발생한 오류를 이야기 한 것임. 즉 컴파일 오류는 컴파일 단계에서 발견하니까 실행 하기 전에 오류를 고칠 수 있는데 예외는 실행 중에 발생하는 오류니까, 미리 예외처리를 안해두면 갑자기 프로그램이 종료되는 등 치명적인 오류가 발생할 수 있음.
예를 들자면, 정수를 0으로 나누는 경우라든지, 배열보다 더 큰 인덱스로 배열에 접근하려 한다든지, 존재하지 않는 파일을 읽으려 한다든지, 정수 입력을 기다리는 코드가 실행되고 있을 때 문자가 입력된 경우 등등이 잇음
자바에서 예외 처리는 일단 예외가 발생하면, 자바 플랫폼(????)이 이를 인지하고, 응용 프로그램에서?? 에게?? 전달
Exception in thread main by zero at DivideByZero.main 이라는 에러 메시지 출력하면서 프로그램이 강제 종료됨.
예외가 발생했다 = 예외가 던져졌다. (어디서 어디에게로??)자바가상기계가 응용 프로그램으로 예외를 던지면 예외가 발생하는 거고
자바 가상 기계가 예외를 감지하고 응용 프로그램에게 예외 객체를 던져서, 응용 프로그램이 응 알겠어 하고 예외 객체를 받음.
예외 처리란 던져진 예외 객체를 받아서(catch) 해서 적절한 작업을 수행하는 것을 말함.(응용 프로그램이) 던져진 예외를 응용 프로그램이 예외 처리 하게 됨. 메시지 출력이나, 재입력을 요구하거나, 무시를 하거나, 프로그램을 종료를 하거나.. 되게 다양한 짓을 할 수 있음. try - catch - finally 문을 사용하면 됨.
try-catch-finally 문에서 try 블록은 반드시 있어야 하고, catch 블록은 1개 이상 있어야 하며 finally 블록은 생략이 가능함.
try 는 예외가 발생할 가능성이 있는 문장은 반드시 이 안에 들어가 줘야 하고, (안 그러면 예외 생겨서 종료될 수 있으니까) 그 예외를 catch 에서 어떻게 처리할 거냐가 결정되기 때문에, catch 도 한 개 이상 있어야 하고, finally 는 예외 발생에 상관 없이 언제나 무조건 실행되는 문장인데 이거는 뭐 생략해도 오케이.
try 블록에서 예외가 발생하지 않은 정상적인 경우, try 를 거쳐 finally 로 점프를 하게 됨
반대로 try 에서 예외가 발생한 경우 그 다음 명령어로 내려가지 않고, 그 자리에서 바로 catch 문으로 넘어간 뒤 예외 처리문을 거치고 finally 를 거쳐 그 밖으로 빠져나감 (에외 발생한 아래의 try 코드들은 실행되지 않음)