에러 : 심각한 오류
자바라는 프로그램의 문제는 오류
예외 : 덜 심각한 오류
프로그래밍하는 나의 문제는 예외
try catch 문
> try {
오류가 날 수도 있는 문장
} catch (예외이름 객체명){
오류 발생시 실행할 문장
}
if문으로 잡힐 수 없는 예외를 try catch로 잡는다.
오류가 나지 않으면 try문이 정상 실행.
오류 발생시 catch문이 실행.
try안에 에러가 발생했다면 자바에서 자동으로
catch 라는 구문을 호출하게 된다.
그리고 에러에 대한 정보를 담고 있는 객체를 매개변수로 전달을 한다. 그 객체의 데이터 타입은 Exception이라는 클래스이다.
try {
} catch(예외이름1 객체명1) {
} catch(예외이름2 객체명2) {
}
try {
} catch(예외이름 객체명) {
} finally {
예외발생 여부에 상관없이 무조건 실행할 문장
}
예외가 발생할 수 있는 로직이 예외가 발생하건 그렇지 않건 언제나 반드시 처리해야 할 일이 있다면 그것을 finally에 위치시켜 주면 된다.
try {
} catch(예외이름1 | 예외이름2 객체명) {
둘 중 하나라도 발생시 실행할 문장
}
예외가 났을 때 왜 예외처리를 해주는걸까?
무조건 실행하고 싶은 부분이 있어도 위에서 오류가 생겨버리면 할 수 없다.
자바는 위에서부터 아래로 쭉 흝어가기 때문.
try catch 문으로 감싸준다면 예외가 발생했을 때를 대처할 수 있다.
Exception e 는 모든 Exception 종류의 부모이기 때문에 굳이 다양한 Exception 종류를 catch문에 나열하지 않아도 된다. Exception e은 위 다른 예외들을 모두 포함하는 것이기 때문에. 즉, 가장 포괄적인 것이기에 맨 밑에 두어야 한다.
e.getMessage - 에러의 이유를 알려준다
e.printStackTrace - 에러가 발생한 위치를 알려준다.
illegalArgumentException
: 매개변수가 의도하지 않은 상황을 유발시킬 때
illegalStateException
: 매소드를 호출하기 위한 상태가 아닐 때
NullPointerException
: 매개 변수 값이 null일 때
IndexOutOfBoundsException
: 인덱스 매개 변수 값이 범위를 벗어날 때
ArithmeticException
: 산술적인 연산에 오류가 있을 때
Throw Exception
throws 책임의 전가
다음 사용자에게 문제를 던진다.
throw new Exception~
throws Exception~
예외라는 것은 폭탄돌리기와 비슷한데,
예외를 사용하는 쪽으로 던질 수 있는데(throw)
이런 식으로 throw를 하다가 어느 지점에서 예외를 처리하려고 할 때 하는 것이 trycatch이고, 아무도 이 처리를 하지 않으려 할 때에 결국 프로그램은 종료되면서 예외메세지가 표시되게 되는 것이다.
예를들어 run이라는 메소드에 throws FileNotFoundException 이라는 예외를 throws 한다라는 것은 이 run이라는 메소드 내부적으로 저 오류가 발생할 수 있다라는 것을 이 메소드 run의 사용자에게 강력한 암시를 주는 것이다. 다른 말로는 저 오류에 대비할 것을 강제하는 의미를 담는 것.
(IOException은 Input과 Output. 입출력에 관한 것임)
throws에 여러 예외를 담을 수도 있다.
A가 B에 throws를 통해 책임을 넘겼다면 B는 이를 trycatch로 해결할수도 아니면 throws를 이용해 또 C에게 이것을 넘길수도 있다.
이 자체가 예외상황을 우리가 관리한다는 뜻인 것이다.
이거 내가 안할거니까 쓰는 쪽인 당신이 처리하세요! 라고 사용하는 것이 throw이다
내가 던지고 싶은 예외를 적어준다
throws IOException 이런식으로.
남에게 미루는 것이기에 내가 trycatch를 할 필요가 없다.