- 1010 (17일차) 예외처리2023년 10월 10일 16시 53분 56초에 업로드 된 글입니다.작성자: 삶은고구마
실습문제 1,2,3,4 피드백 完
예외처리(Exception)
:에러 - 해결할 수 없는 심각한 오류 - 재실행
:예외처리 - 분기에 따라 정상적으로 복구 가능
비정상적인 종료를 예외처리를 통해 정상흐름으로 돌려놓음
타입 Error Exception 개념 -치명적인 오류
-회복 불가능,예외처리 사용 불가-회복가능한 오류
-예외처리를 사용할 수 있음종류 메모리가 소진되는 오류
OutOfMemoryError
:heap영역 메모리 소진
ex)배열크기가 integer 최댓값
StackOverFlowError
:stack영역 메모리 소진
ex)잘못된 재귀함수
(함수가 자기자신을 무한 호출)
InputMismatchException
타입 불일치 오류
ex)정수값받아야하는데 문자열값 대입
ArithmeticException
어떠한 수를 0으로 나눌때 오류(불능)
ex) 100/0
NullPointerException
null인 값을 사용하는 경우
ex)str = null; str.length()
그 외 인덱스 오류인
ArrayIndexOutOfBoundsException
IndexOutOfBoundsException
등등..컴파일 에러(compilie time) / 런타임 에러 : 에러 발생시기에 따라 구분.
컴파일:잘못된 구문 작성 시 발생
런타임:스캐너 에러
시스템 에러: 컴퓨터 오작동 소스구문으로 해결 불가
런타임익셉션의 후손:Unchecked/그 외:Checked unchecked 예외 checked 예외 실행 시점 코드 상 문제 없음.
실행 시(runtime) 발생컴파일 단계에서 발생.
에러나는 라인을 알려줌.종류 RuntimeException 포함 후손들 RuntimeException들을 제외한 나머지. 예시 Scanner로 정수값을 입력받으려 하는데
문자열이나 다른 것을 입력받을 경우,
InputMismatchException 발생FileReader로 특정 txt파일을 읽어오려고 할때
코드 작성 시 에러발생.
throws 나 try-catch 사용해야 함.
try ~ catch ~ finally
1.구조
try
{
오류 발생 가능성 코드(안 날 수도있음)
}
catch(Exception e)
{
오류 발생 시 실행
}
finally
{
오류 유무와 상관없이 실행됨 (조기 리턴할때도 실행됨)
}
/** * try - catch 블럭 실행 순서 * */ private void test3() { System.out.println(1); try { System.out.println(2); if(true) return;//조기리턴 String str = null; str.length(); System.out.println(3); } catch (NullPointerException e ) { System.out.println(4); } finally { //try절의 예외 발생여부와 관계없이 무조건 실행 System.out.println(100); //중간에 조기리턴이 있어도 무조건 실행 } System.out.println(5); }
2.다형성
자식객체를 부모타입으로 제어try catch문 사용시, catch 때 여러 Exception 사용 가능하다.
단! 자식->부모 순으로 사용해야함.
오류마다 다른 처리를 하고싶다면 상위 클래스를 맨 아래에 두고 내가 원하는 예외처리를 상단에 두자
최고 부모 클래스인 Exception 을 먼저 선언하면 아래의 후손 예외처리들은 쓸모가 없어짐. /** * catch절의 다형성 * - 자식객체를 부모타입으로 제어 * - 자식/부모 타입의 catch 블럭을 나열 할 때는 자식-부모 순으로 작성해야한다. */ private void test4() { try { System.out.print("정수 입력:"); int m = sc.nextInt(); System.out.println(m); String str = null; System.out.println(str.length()); } // catch(InputMismatchException e) // { // System.out.println("정수만 입력 가능합니다.."); // System.out.println(e); // } // catch(NullPointerException e) // { // System.out.println("str는 null일 수 없다."); // System.out.println(e); // } catch(RuntimeException e) { System.out.println("Runtime........:"+e); //혹은 위에 주석처리 풀린 것 버전으로도 가능.셋중 먼저 걸린 catch문으로 사용 //단 부모타입은 맨 뒤에 둬야함. } catch(Exception e) { System.out.println("Exception.......:"+e); } }
if~else문을 사용하지 않고 분기 처리가 가능하다.(throw 예외 던지기)
-try문 안에 예외가 발생할 가능성이 있는 코드를 넣는다.
-checkAge2()에서 입력한 정수값을 나이로 받고 20살 미만/이상인지 판단
예외가 발생한다면 throw new underAgeException 이라는 커스텀 익셉션을 던진다.
나이가 20세 미만이면 다시 함수호출부로 돌아와서 바로 catch문을 실행
미성년자라 게임을 할 수 없다 문구 출력.
/** * 예외 던지기를 통한 분기 흐름 만들기 */ private void test2() { try { checkAge2(); //미성년자인 경우 예외처리 System.out.println("게임을 시작합니다.😜😜"); } catch(Exception e) { System.out.println("미성년자는 게임을 할 수 없습니다.😰😰😰😰"); System.out.println(e.getMessage()); //("미성년자 : "+ age+"세"); } } private void checkAge2() { System.out.print("나이 입력 : "); int age = sc.nextInt(); if(age < 20) throw new underAgeException("미성년자 : "+ age+"세"); //underAgeException //던져진 예외는 checkAge2를 호출한 곳으로 돌아간다 }
custom Exception - underAgeException
기본생성자 포함 super class 생성자를 만들어준다. 끝.
package sh.java.exception; public class underAgeException extends RuntimeException { public underAgeException() { super(); // TODO Auto-generated constructor stub } public underAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } public underAgeException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public underAgeException(String message) { super(message); // TODO Auto-generated constructor stub } public underAgeException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } }
예외 미루기 (Throws)
RuntimeException과 관계없는 모든 클래스
예외처리(try catch) 강제화 즉, 예외처리를 하지 않으면 컴파일 오류 유발
우회적인 처리를 강제화 할 목적으로 입/출력 관련 메소드 등에서 쉽게 확인
(추상클래스와 비슷하다)
예외처리 혹은 예외회피 둘 중 하나는 반드시 해야함
주의사항:
예외처리를 미루다가
main함수에 throws를 걸 수도 있는데, 이건 예외처리를 안한거나 마찬가지.
실행하면 오류발생함. 제 때 예외처리를 해두는게 좋다.
package sh.java.exception; import java.io.FileNotFoundException; import java.io.FileReader; /** * * 2023-10-10 * checked Exception * -Exception 후손 클래스 중에서 RuntimeException와 관계없는 모든 클래스 * -예외처리(try-catch)를 강제화 * -즉, 예외처리 안하면 컴파일 오류 유발 * -우회적인 처리를 강제화 할 목적으로 입/출력관련 메소드 등에서 쉽게 확인 가능 * -예외처리(try catch) 또는 예외회피(throws) 둘 중 하나는 반드시 해야함 * */ public class ThrowsExceptionStudy { //main에서 예외처리 던져버리면 오류발생함(더 이상 던져줄 곳이 없음) 예외처리 안한거랑 같음 public static void main(String[] args)//throws FileNotFoundException //throws FileNotFoundException { ThrowsExceptionStudy study = new ThrowsExceptionStudy(); try { study.test1(); } catch(Exception e) { e.printStackTrace(); } //study.test1(); System.out.println("정상종료"); } //예외회피:예외처리의 의무를 메소드 호출부로 미룸 private void test1() throws FileNotFoundException { //예외처리 // try // { // FileReader fr = new FileReader("abc.txt"); // } // catch(FileNotFoundException e) // { // e.printStackTrace(); // } FileReader fr = new FileReader("abc.txt"); } }
예외처리로 해결 할 수있는 일은 무궁무진하다.
잘못 된 부분이 어디인지,(런타임은 조금 어려울지도)
무슨 오류인지도 알려주기 때문에 긴가민가하다면 쓰는 것이 좋을 것 같다.
'공부' 카테고리의 다른 글
1012(19일차) 수정중.. (0) 2023.10.12 1011 (18일차) (4) 2023.10.11 1006(16일차) (0) 2023.10.06 1005(15일차) (0) 2023.10.05 1004 14일차 (2) 2023.10.04 다음글이 없습니다.이전글이 없습니다.댓글