에러
: 개발자가 조취를 취할 수 없는 수준
ex) 메모리 부족, JVM 동작 이상
컴파일 에러
: 컴파일 시 발생하는 에러
ex ) 오타, 잘못된 자료형 등
런타임 에러
: 프로그램 실행 도중에 발생하는 에러
ex) 배열에 할당된 크기를 넘어서 접근했을 때, 0으로 나눌 떄
로직 에러
: 실행은 되지만 의도와는 다르게 동작하는 에러
예외
: 다른 방식으로 처리 가능한 오류
ex) 입력값 오류, 네트워크 문제
예외 발생 시 적절하게 처리하기 위해, 자바에서 제공하는 예외처리 문법
[ try ~ catch문 ]
try{ 예외가 발생할 수 있는 명령; } catch(발생할 수 있는 예외 클래스명){ 예외 발생 시 실행할 명령; }
예시 1 ) 0으로 나눌 때 발생하는 에러
ArithmeticException
public static void main(String[] args) { try { int[] a = {2,0,0}; int b = 4; int c = b/a[2]; System.out.println(c); }catch ( ArithmeticException e) { //0으로 나눌 수 없을 때 System.out.println("산술 오류 발생"); }catch (ArrayIndexOutOfBoundsException e) { System.out.println("배열 길이 오류 발생"); } System.out.println("예외처리 공부 중"); }
- 0으로 나눌 때는 ArithmeticException 에러가 발생한다.
예시 2 ) 배열의 index를 벗어났을 때 발생하는 에러
ArrayIndexOutOfBoundsException
public static void main(String[] args) { try { int[] a = {2,0}; int b = 4; int c = b/a[2]; System.out.println(c); }catch ( ArithmeticException e) { System.out.println("산술 오류 발생"); }catch (ArrayIndexOutOfBoundsException e) { // 인덱스가 2인 값이 없을 때 System.out.println("배열 길이 오류 발생"); } System.out.println("예외처리 공부 중"); }
- a배열의 index가 2인 값이 없을 때 발생하는 에러
[ try ~ catch ~ finally문 ]
try{ 예외가 발생할 수 있는 명령; } catch(발생할 수 있는 예외 클래스명){ 예외 발생 시 실행할 명령; } finally{ 예외가 발생하든 안하든 무조건 실행하는 명령; }
예시
public static void main(String[] args) { int a= 0; int b = 2; try { System.out.println("외부로 접속"); int c = b/a; } catch (ArithmeticException e) { System.out.println("오류가 발생하였습니다."); } finally { System.out.println("무조건 연결해제"); } }
- 0으로 나눠서 ArithmeticException 에러 발생
- catch문 실행
- 오류가 발생하든, 안하든 finally 문은 무조건 실행됨.
Exception 클래스의 객체
이다.객체지향 언어
이기에 예외도 객체로 처리
한다.Exception 클래스를 상속
받으므로Exception 클래스로 처리
가 가능하다.Exception 클래스
의 메서드를 사용
할 수 있다.public static void main(String[] args) { try { Exception e = new Exception("고의 예외"); throw e; //고의로 예외를 던지겠다. } catch (Exception e) { System.out.println("예외 발생"); System.out.println(e.getMessage()); } }
- Exception 객체 생성 후, Exception 클래스의 getMessage() 메서드 호출
- exeption 생성자 호출 시 전달했던 문자열이 내부적으로 저장되어, 객체.getMessage()를 호출하면 출력된다.