컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
에러 : 수습할수 없는 심각한 오류
예외 : 수습할수 있는 미약한 오류
두 그룹으로 나누어 지게 된다.
1. Exception클래스와 그 자손들
2. RuntimeException클래스와 그 자손들
Exception클래스들 : 사용자의 실수, 외적인 요인으로 발생
RuntimeException클래스들 : 프로그래머의 실수로 발생
Exception클래스가 예외 클래스중 최상위 조상클래스이다
예외는 프로그래머가 미리 대처할수 있기 떄문에 처리를 미리 해주어야 한다.
주로 try-catch를 이용한다.
catch블럭 같은경우에는 하나 이상이 올수 있으며 예외의 종류에 일치하는 단 한가지 catch블럭이 실행된다.
-> 만약 예외의 종류에 일치하지 않는다면 실행 되지 않는다.
try블럭 내에서 예외가 발생한 경우
1. 발생한 예외와 일치하는 catch블럭을 찾아본다.
2. 일치하는 catch블럭을 찾으면 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 수행한다.
try블럭 내에서 예외가 발생하지 않은 경우
1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행한다.
try블럭에서 예외가 발생하면, 예외가 발생한 위치 이후에 있는 try블럭의 문장들은 수행이 되지 않는다
==> 주의하여 try블럭에 포함시킬 코드의 범위를 선정해야 한다.
catch(){} 로 구성되어 있음
() 안에는 처리하고자 하는 예외와 같은 타입의 참조변수를 선언
{} 안에는 예외발생시에 실행시킬 코드를 입력
첫번쨰 catch블럭에서 조건에 맞는 예외를 찾게되면 그 이후의 catch블럭은 실행이 되지 않는다.
== 단 한개만의 catch구문이 발생한다.
만약 ()안에 예외 타입을 Exception으로 선언하게 된다면 모든 예외를 처리할수 있다.
== Exception이 최상위 조상 클래스 이기 떄문에
printStackTrace() : 예외발생 당시의 메서드의 정보와 메시지를 화면에 출력
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 출력
--> 모두 참조변수.~~ 으로 사용이 가능한 메서드들
멀티 catch블럭도 사용이 가능하다
catch(예외코드1 | 예외코드2){}
1,2둘중 하나의 예외가 걸리면 catch문이 발동
하지만 멀티 catch블럭을 사용할떄에는 조상과 자손의 관계가 되면 안된다.
--> 조상 + 자손 == 조상 이기 떄문에
개인적으로는 왜 고의로 예외를 발생시키는지는 모르겠다.
키워드 throw를 사용해서 고의로 예외를 발생시킬 수 있다.
example
Exception e = new Exception();
throw e;
== throw new Exception(); 와 같은 내용
메서드에 예외를 선언하려면, 선언부에 키워드 throws를 사용한뒤 발생할 수 있는 예외를 적어주면 된다.
=> 이 메서드를 사용하기 위해서는 어떤 예외들을 처리해야 하는지를 알수가 있다.
== 메서드를 사용하는 쪽에서 처리하라고 강요 가능
예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다,
선택적으로 마지막에 덧붙여 사용할수 있다.
주로 입출력에서 사용되는 구문으로 후에 배우게 된다.