- 자바의 정석 97~103강 ch8 예외처리2023년 08월 09일 08시 07분 12초에 업로드 된 글입니다.작성자: 민발자728x90
ch 8-1~3 프로그램 오류, 예외 클래스의 계층구조
1. 프로그램 오류
컴파일 에러 : 컴파일할 때 발생하는 에러
런타임 에러 : 실행할 때 발생하는 에러
논리적 에러 : 작성 의도와 다르게 동작
2. 컴파일 에러
컴파일러 역할 : 구문체크, 번역, 최적화
코드를 번역 중 잘못된 코드를 발견하면 알려주는 것 실행자체가 안됨
3. 런타임 에러
실행 시 발생되는 오류로 프로그램 종료
에러 : 코드에 의해서 수습될 수 없는 심각한 오류 ex)OutOfMemoryError
예외 : 코드에 의해서 수습된 수 있는 미약한 오류
4. 예외 처리
예외 발생에 대비한 코드를 작성하는 것
프로그램의 비정상 종료를 막고 실행상태 유지
5. 예외 클래스
Exception 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생
- IOException : 입출력 예외
- ClassNotFoundException : 클래스를 못 찾을 때
RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외
- ArithmeticException : 산술계산예외
- ClassCastException : 형변환
- NullPointerException : null을 가지는 객체 참조를 사용할 때
- IndexOutOfBoundsException : 배열 범위 벗어날 때
ch 8-4~6 예외 처리하기, try-catch문의 흐름
1. try-catch문
예외가 발생하면 처리할 catch블록으로 이동
Exception이 선언된 catch블럭은 모든 예외처리되므로 마지막에 위치하는 것이 좋음
→ 위쪽에 해당하는 예외 catch블럭이 있으면 실행 안됨
try { // 예외가 발생할 가능성이 있는 문장 } catch (Exception e) { // Exception 발생시 처리 문장 }
ch 8-7~8 printStackTrace(), 멀티 catch블럭
1. 예외발생 흐름
예외 발생 → 예외 객체 생성(예외 정보, 메서드) → catch블럭 참조변수로 → 예외처리
참조변수는 유효범위는 해당 catch블럭
2. 예외 객체의 메서드
printStackTrace() : 예외 발생 당시 호출 스택에 있던 메서드 정보, 예외메세지 출력
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지 반환
3. 멀티 catch블럭
내용이 같은 catch블럭 하나로 합침 JDK1.7부터
부모-자식 관계는 불가
두 예외 모두 가지고 있는 공통멤버만 사용가능
try { ... // 멀티 catch블럭 } catch (ExecptionA | ExecptionB e) { e.printStackTrace(); }
ch 8-9~10 예외 발생 시키기
1. 예외 발생 시키기
// 예외 객체 생성 Exception e = new Exception("예외 메세지"); // 예외 발생 시킴 throw e;
연산자 new사용해 예외 클래스 객체 생성 후 키워드 throw를 이용해 예외를 발생시킴
2. checked & unchecked 예외
checked
컴파일러가 예외처리 여부를 체크하기 때문에 예외처리 필수
Exception과 자손
unchecked
컴파일러가 예외 처리 여부 체크 안함 예외처리는 선택 사항
RuntimeException과 자손
ch 8-11~14 예외 선언하기, finally블럭
1. 예외를 처리하는 방법
① try-catch
② 예외 선언하기
③ 은폐(빈 catch블럭 생성)
2. 예외 선언하기
throws 키워드 이용 예외를 호출하는 쪽에 전달함
// throws 키워드 이용해 메서드에 예외 선언 void method() throws ExceptionA, ExceptionB, ... { }
예외의 최고 조상인 Exception을 선언하면 모든 종류의 예외 발생 가능성이 있다는 의미
class Ex8_10 { public static void main(String[] args) { try { File f = createFile(args[0]); System.out.println( f.getName()+"파일이 성공적으로 생성되었습니다."); } catch (Exception e) { System.out.println(e.getMessage()+" 다시 입력해 주시기 바랍니다."); } } static File createFile(String fileName) throws Exception { if (fileName==null || fileName.equals("")) throw new Exception("파일이름이 유효하지 않습니다."); File f = new File(fileName); // File클래스의 객체를 만든다. // File객체의 createNewFile메서드를 이용해 실제 파일을 생성한다. f.createNewFile(); return f; // 생성된 객체의 참조를 반환한다. } } /* ""입력시 args[0] = "" createFile메서드로 전달 createFile메서드의 if문 false로 Exception 객체 생성 throws Exception로 예외 선언해 main으로 예외 전달 예외를 전달 받은 main에 try-catch문에서 예외 처리 =>출력 파일이름이 유효하지 않습니다. 다시 입력해 주시기 바랍니다. */
3. finally 블럭
예외 발생 여부와 관계없이 수행되어야 하는 코드
try ( // 예외가 발생될 가능성이 있는 문장 } catch (Exception e) { // 예외 발생시 수행될 문장 } finally { // 예외가 발생하더라도 실행되어야 하는 문장 }
ch 8-15~17 사용자 정의 예외 만들기, 예외 되던지기
1. 사용자 정의 예외
직접 예외 클래스를 정의할 수 있음
Exception, RuntimeException 중 선택하여 상속을 통해 작성
class MyException extends Exception { // MyException(생성자 예외메세지를 매개변수로 받는 생성자) MyException(String msg){ // 조상인 Exception클래스의 생성자 호출 super(msg); } }
2. 예외 되던지기
예외를 처리한 후 다시 예외를 발생시키고 호출한 곳에서 다시 처리
호출한 메서드와 호출된 메서드 양쪽 모두 예외 처리
class Ex8_12 { public static void main(String[] args) { try { method1(); } catch (Exception e) { System.out.println("main메서드에서 예외가 처리되었습니다."); } } static void method1() throws Exception { try { throw new Exception(); } catch (Exception e) { System.out.println("method1메서드에서 예외가 처리되었습니다."); throw e; // 예외를 다시 발생시킴 } } } /* main에서 method1 호출 method1에서 예외 발생 catch문으로 예외 처리 후 다시 예외 발생 method의 throws Exception로 main으로 예외 전달 main의 catch문에서 예외 처리 => 출력 method1메서드에서 예외가 처리되었습니다. main메서드에서 예외가 처리되었습니다. */
ch 8-18 연결된 예외
1. 연결된 예외
한 예외가 다른 예외를 발생
// 원인 예외로 등록 Throwable initCause(Throwable cause) // 원인 예외 반환 Throwable getCause()
여러 예외를 하나로 묶어서 다루기 위해 사용
checked 예외를 unchecked예외로 변경하려 할 때 사용
728x90'정리 > Java' 카테고리의 다른 글
자바의 정석 109~113강 ch9 java.lang 패키지와 유용한 클래스(2) (0) 2023.08.13 자바의 정석 104~108강 ch9 java.lang 패키지와 유용한 클래스(1) (0) 2023.08.12 자바의 정석 94~96강 내부클래스, 익명 클래스 (0) 2023.08.07 자바의 정석 89~92강 인터페이스, 인터페이스와 다형성, 장점, 디폴트 메서드, static메서드 (0) 2023.08.07 자바의 정석 86~88강 추상 클래스, 추상 메서드 (0) 2023.08.07 다음글이 없습니다.이전글이 없습니다.댓글