18일차
예외처리
- 예외 : 런타임 에러 (프로그램 실행중 에러)
- 런타임 에러가 왔을 때 어떻게 대응할지에 대한 명세작성
- 예외처리를 작성하면 예외 발생시에도 프로그램이 계속 동작
- 런타임에러는 조건검사를 사용해 얼마든지 회피,방지가능
예외
- 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의해 발생하는 오류
- ex) 0으로 나누기 같은 잘못된 연산, 배열의 인덱스 초과, 디스크에서는 하드웨어 에러
예외처리기
-try : 예외가 발생할수 있는 코드를 try 안에 넣음
-catch : try에서 예외가 발생하면 처리해줌
ArithmeticException
- catch에서 사용되는 클래스
- ArithmeticException는 는 예외상황을 알리기 위해 정의된 클래스
- 모든 예외클래스는 Throwable 클래스를 상속하며 이 클래스에서는 getMessage 메소드가 정의되어 있다.
- getMessage 메소드는 예외가 발생한 원인 정보를 문자열형태로 반환하여 알려주는 메소드이다.
- 배열의 경우 예외클래스 ( ArrayIndexOutOfBoundsException )
- 허용할 수 없는 형변환 연산을 진행하는 예외상황에서의 클래스 ( ClassCastException )
- 배열선언 과정에서 배열의 크기를 음수로 지정하는 예외상황에서의 클래스 ( NegetiveArraySizeException )
- 참조변수가 null로 초기화된 상황에서 메소드를 호출하는 예외상황에서의 클래스 ( NullPointerException )
- 이외에도 많은 예외클래스가 존재
?하나의 try블록에 둘 이상의 catch블록을 구성할 수 있기 때문에
?예외처리와 관련된 부분을 완전히 별도로 떼어놓을 수 있다.
여러개의 catch가 있으면
첫번째 catch부터 내려오면서 예외처리가 가능한지 확인하면서 내려간다.
그러나 첫번째 catch블록에 Throwable을 쓰면 뒤에 어떠한 catch블록도 쓸수가 없다.
왜냐하면 Throwable는 모든 예외처리클래스를 받는다고 했으니까 Throwable에서 모든것을 걸러내기 때문이다.
항상 실행되는 finally
try{} catch{Throwable e} finally{}가 있는데 finally는
무조건 실행되는 것이다.
언제나 무조건 실행이 아니라 try블록으로 들어오면 실행이 반드시 되는것이다.
return으로 끝낸다고 해도, return 전에 finally가 실행되고 return으로 끝낸다.
예외의종류
Error (OutOfMemoryError , AWTError , ThreaeDeath )
-system에서 발생하는 심각한에러
-JVM을 돌리는 운영체제 자체에서 문제가 발생 (예외처리대상 x 우리가 어찌못함)
Exceotion( RuntimeException, IOException )
RuntimeException : 선택적으로 예외처리 적용 ( 필수 아님 )
IOException : 우리 프로그램 메모리 영역 바깥 누군가와 데이터를 주고받을 때 발생할수 있는 예외 ( 필수 )
-read메소드는 체킹예외인 IOException을 발생시켜서 예외처리해줘야댐
-함수 뒤에 throws IOException 넣어주면 해당 함수의 몸통안에 IOException을 발생시키는 코드를 예외처리없이 사용가능 ( main에서는 왠만하면 throws 하지않기 )
체크 예외 : 컴파일러가 예외처리를 강요 ( IOException )
비체크 예외 : 컴파일러가 신경안쓰는 예외 ( RuntimeException )