-
🎮 [JAVA 자바] #6 | 자바 예외처리, Try-catch-finally, 다중 catch, Checked / Unchecked 예외, throw, throwsCS/Java 2022. 4. 17. 02:40
🎮 예외처리
- 자바의 오류
1. 컴파일 오류 : 실행 전 문법적 오류
2. 런타임 오류 :
- 예외(Exception) : 프로그램 실행 도중 오류가 발생했지만 동작을 계속 수행할 수 있는 오류. 동작 가능, 처리 가능
- 에러(Error) : 프로그램이 더 이상 동작할 수 없는 심각한 오류로 예측 불가능, 수습 불가능 (ex. VM고장, OutOfMemory, 스택이상)
3. 논리적 오류 : 디버거 통해서 해결
- 자바의 예외 처리 (Exception Handling)
프로그램 실행 도중 에러에 대해서는 프로그램에서 처리(핸들링)하지 않고 예외에 대해서만 처리(핸들링)
예외의 발생에 대비한 코드를 작성하는 것이 예외 처리로, 예외가 발생되었을 때 강제 종료되지 않고 정상 실행 되도록 처리함이 목적
* 처리 가능 오류 : 정수를 0으로 나누기, 배열 인덱스 범위 벗어남, 존재하지 않는 파일 열기, 정수 입력 받아야되는데 문자 입력된 경우
- java.lang.Throwable
String getMessage() : 오류의 원인을 담고 있는 문자열 반환
void printStackTrace() : 오류가 발생한 위치와 메소드 정보 출력
- 오류 관련 클래스들의 계층도
모든 예외 클래스들은 java.lang.Exception 클래스를 상속받음
더보기[ Exception의 분류 ]
1. 예외 정의에 따른 분류
- System defined Exception
- User defined Exception
2. 컴파일 처리방식에 따른 분류
- Unchecked Exception : 컴파일러가 명시적으로 예외처리 요구하지 않음 (RuntimeException + 후손들)
- Checked Exception : 컴파일러가 명시적으로 예외처리를 요구 (Exception 후손들 중 Unchecked Exception 아닌 것들)
* NumberFormatException : (ex. 객체 요소들 정수로 변환하려 했는데 실수가 존재 (Integer.parseInt(stringNumber[i])) )
* ArithmeticException : (ex. 나눗셈에서 분모에 0이 들어감)
* ArrayIndexOutOfBoundsException : 배열 인덱스 범위 벗어남 (ex. 배열 크기 4인데(index:0~3) 인덱스 4에 접근)
* InputMismatchException : (ex. scanner.nextInt()에서 정수 입력받게 했는데 문자 입력됨)
* Exception : 모든 예외. 하지만 catch (Exception e)는 권장되지 않음
* IOException 또는 FileNotFoundException : (ex. FileWriter fo = new FileWriter("log.txt"))
- 예외의 처리 과정
1. 명령 실행 중 예외 발생
2. 예외 원인에 따른 Exception 객체 생성 (in JVM)
3. 생성한 Exception 객체를 프로그램에 던짐 (Throw)
4. 생성한 Exception 객체를 catch하지 않으면 강제종료. catch하면 정상종료 (in Program)
🎮 Try-catch-finally
try { // 예외가 발생할 가능성이 있는 코드 } catch (처리할 예외 타입 1) { // catch는 1개 이상 // catch한 예외를 처리 } catch (처리할 예외 타입 2) { // catch한 예외를 처리 } finally { // 생략 가능 // 예외가 있든 없든 실행되는 코드 }
- 예외 처리문의 실행 흐름
try 블록에서 예외 발생 X : 바로 finally 블록으로 간다.
try 블록에서 예외 발생 0 : 예외 타입에 맞는 catch 블록으로 들어간 뒤, finally 블록으로 간다.
- 0으로 나누는 예제
try { result = dividend / divisor; } catch (ArithmeticException e) { System.out.println("Catch : 0으로 나눌 수 없습니다." + e.getMessage()); // '/ by zero' 출력 // 다중 오류면 null 출력 } finally { System.out.println("Finally:"); }
🎮 다중 catch문
- 다중 catch문
실행문 여러개인 경우 발생할 수 있는 예외 종류도 많아진다.
catch블록 여러개 써서 발생된 예외와 일치하는 catch문 수행하면 된다.
try-catch문 안에 또 try-catch써서 중첩 가능. 하지만 예외를 받을 변수로 같은 이름을 쓰면 오류.
try { ... } catch (ArithmeticException e) { // 예외 타입 1 System.out.println(e.getMessage()); } catch (InputMismatchException e) { // 예외 타입 2 System.out.println(e.getMessage()); } finally { ... }
🎮 Checked / Unchecked 예외
- Unchecked Exception 예외 전파
예외가 발생된 곳에서 처리되지 않으면 상위 레벨(그 메소드 호출한 함수)로 전파된다.
1) 예외가 catch되어 처리될 때까지 2) 또는 main()에 도달할 때 까지 전파된다.
만약 메인함수의 try블록에 예외가 일어날 수 있는 함수를 적고, 그 함수에서 예외처리를 안했다면, 메인함수의 catch블록에서 처리해주면 된다.
- checked Exception 예외 처리
1) 자신이 처리하든지 2) 명시적으로 떠 넘기던지(throws)를 선언해야함. 컴파일러가 검사함
* Unchecked Exception : 컴파일러가 명시적으로 예외처리 요구하지 않음 (RuntimeException + 후손들)
* Checked Exception : 컴파일러가 명시적으로 예외처리를 요구 (Exception 후손들 중 Unchecked Exception 아닌 것들)
* 종류는 위에 '오류 관련 클래스들의 계층도'에 있음
🎮 throw, throws
- Throw문
명시적(강제적)으로 예외 발생시킴. 사용자 정의 또는 필요에 의한 Exception 클래스 예외 발생시 사용. 특히 checked 처리를 떠넘길 때 사용. 예외가 발생한 곳에서 예외처리 안하고 호출한 곳으로 발생된 예외를 떠넘김. 적어도 메인 메소드에서는 try-catch 처리 해줘야됨.
throw new Exception클래스( [args] );
public void someFuntion() throws Exception // 예외를 caller에게 떠넘김 { throw new Exception("MyException"); // checked exception throw new RuntimeException("MyException"); // unchecked exception. throws할 필요 X }
🎮 Assert문
- Assert (JDK 1.4)
어떤 내용에 대해서 확실한 단언을 할 때 사용하는 키워드로, 실행시에 화면출력 없이 변수나 코드의 흐름에 대해서 검증할 수 있는 코드 작성 가능.
assert [boolean 식]; -> false이면 AssertError가 발생되어 비정상 종료
int a=1; assert a==0; // 반드시 변수 a가 0이어야 한다는 뜻이다. 0이 보장되어야하는데 1이므로 AsserError발생
기본적으로 Assertion기능 수행되지 않도록 설정되어있어서, 설정의 Debug Configurations에서 VM arguments에 -ea라고 써준다. (-da는 disable하게 해준다.)
'CS > Java' 카테고리의 다른 글
🎮 [JAVA 자바] #8 | 자바 메소드와 접근 지정, 객체 배열, 인자 전달 (0) 2022.04.17 🎮 [JAVA 자바] #7 | 자바 클래스와 객체, 객체지향 프로그래밍, static, final, 메모리, 생성자 (0) 2022.04.17 🎮 [JAVA 자바] #5 | 자바 배열, 다차원 배열, Arrays 클래스 (0) 2022.04.17 🎮 [JAVA 자바] #4 | 자바의 조건문과 반복문, 열거형 | enum, if-else, while, switch (0) 2022.04.16 🎮 [JAVA 자바] #3 | 자바의 연산자, 연산자 우선순위 (0) 2022.04.16