프로그램 실행중 예기치 못한 상황을 미리 예측하고 처리하는 것을 예외처리라고 한다.
기본적으로 런타임 시점에서 발생되는 오류는 에러(error)와 예외(exception)으로 나뉨
에러
-메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류
예외
-인자값 Null 에러 NPE(NullPointExceprion)같은 발생하더라도 수습이 가능한 덜 심각한 오류.
실행예외(RuntimeException)
Runtime Error
-프로그램 실행 시점에서 발생하는 에러
-문법 오류나 오타등은 컴파일 시점에서 예측 가능한 오류를 잡아줄 수 있지만 실행 중 발생하는 잠재적 에러까진 잡을 수 없기에 컴파일은 완료되어 프로그램 실행되고 실행도중 의도치 않은 동작에 대처하지 못해 에러가 발생할 수 있다.
-예외가 발생하면 JVM은 해당하는 실행 예외 객체를 생성<-실행 예외는 컴파일러가 예외 처리 여부를 확인하지 않기에 개발자가 예외 처리 코드 추가 여부를 결정
대표적 실행 예외
ArithmeticException 0으로 나누기 같은 부적절한 산술 연살을 수행할 때 발생IllegalArgumentException 메서드에 부적절한 인수를 전달할 때 발생IndexOutOfBoundsException 배열, 벡터 등에서 범위를 벗어난 인덱스를 사용할 때 발생NoSuchElementException 요구한 원소가 없을 때 발생NullPointerException null 값을 가진 참조 변수에 접근 할 때 발생NumberFormatException 숫자로 바꿀 수 없는 문자열을 숫자로 변환하려 할 때 발생 EX)10
일반 예외
Compile Error 컴파일 시점에서 소스의 오타나 잘못된 구문, 자료형 체크등의 검사를 수행할 때 발생하는 에러 이 시점에서 발생하는 문제들을 수정 후 컴파일을 ㅇ성공적으로 마칠경우 클래스 파일(\*class) 파일이 생성된다. 컴파일러는 발생할 가능성을 발견하면 컴파일 오류를 발생 개발자는 예외 처리 코드를 반드시 추가Logical Error 소스 코드 컴파일도 정상적으로 되고 런타임상 에러가 발생하는 것도 아닌 개발자의 의도와 다르게 동작하는 에러. 시스템 상 프로그램이 멈추지는 않지만, 의도와는 다르게 동작하는 것 ex) 버튼을 클릭하면 팝업이 뜨게 만들었으나 팝업이 아닌 새로운 페이지가 뜨거나 아무동작을 안하는 것들
대표적인 일반 예외
ClassNotFoundException 존재하지 않는 클래스를 사용하려고 할 때 발생InterruptedException 인터럽트 되었을 때 발생NoSuchFieldException 클래스가 명시한 필드를 포함하지 않을 때 발생NoSuchMethodException 클래스가 명시한 메서드를 포함하지 않을 때 발생IOException 데이터 읽기 같은 입출력 문제가 있을 때 발생
※어떤 Exception이 발생할지 모를 때는 catch(Exception e)와 같이 Exception클래스를 이용
try-catch:
try { //... }
catch (Exception error) { //... }
finally{//필수 실행 구문}
참고
parselnt
printStackTrace()와 getMessage() -> 예외 발생시 예외에 대한 정보를 printStackTrace()와 getMessage()를 통해 얻을 수 있다.
printStackTrace() -> 예외 발생 당시 호출스택(Call Stack)에 잇었던 메서드의 정보와 예외 메세지 화면에 출력
getMessage() -> 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.