Govern/Eclipse SE -상속,클래스,타입

07-26(월) 1.사용자예외클래스 throws/throw

Mary's log 2021. 7. 27. 07:51

※ 개인적인 개발 수업 정리글입니다. 꾸준히 정리할 예정이고 틀린 부분이 있다면 언제든지 댓글 환영입니다.


9장. 예외처리 Exception

★발견한 예외를 수정하는건 내가 하는거고!!!! 예외처리는 어디서 예외가 왜 발생했는지 알려주는거임!!!!

-ArithmeticException : 0으로 나누는 경우에 발생됨.
=> if문과 같은 조건문으로 먼저 나누는 수가 0인지 체크하면 예외발생 방지가능.


-NullPointerException : null값을 가진 참조변수로 객체 멤버 접근시 발생됨.
=> 객체를 접근하기 전에 참조변수가 null인지 체크하면 예외발생 방지가능.


-ArrayIndexOutOfBoundsException : 배열의 index범위를 넘어서 참조하는 경우.
=> 배열의 길이를 먼저 체크하고 참조하면 예외발생 방지가능.


-ClassCastException : 형변환 연산자 사용시 타입이 일치하지 않는 경우 발생됨.
=> 형변환하기 전에 instanceof 연산자를 사용하여 객체타입확인후 형변환하면 예외발생 방지가능.

 

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

이 모든 예외처리를 하기 위해서 예외클래스, try-catch-finally문, throws 사용

 try  {

 

         이런 예외가 발생할거야              =>여기 짱 길음

 

        } 

catch 잡아 ( 예외클래스  변수명 )  {  잡은걸 이렇게 해  } 

문장1                             
 try  { 문장2                   

        예외발생코드      // int num = 3/0 ; //ArithmeticE 발생
        문장3                     X

      }  catch  (예외클래스명 변수명 ) {    // ArithmeticE가 뜨면 e이라는 이름으로 이용.
         예외처리코드                        // 이렇게 할거임. 보통 출력문
}
문장4                             

 

< 다중 try-catch 문 >
try {
    //예외발생할만한 코드1
    //예외발생할만한 코드2
    } catch (예외클래스명1 변수명 ) {         // 예외클래스명1 작은 타입을 먼저 써줘야함
    //예외처리코드
    } catch (예외클래스명2 변수명 ) {         // 예외클래스명2 큰 타입을 나중에 써줘야함
    //예외처리코드
}

- if ( 변수 instanceof 클래스명1) {...          <=instanceof 때처럼 작은 타입을 먼저 써줘야함

 

try-catch문

(예제)

프로젝트 11Day0의 클래스  ExceptionTest4

 

 

프로젝트 11Day0의 클래스  ExceptionTest5

try-catch문 + try-catch문 해서 예외처리 잡기

 

 

■   finally 문 

-try-catch문 마지막에 넣어서, 사용했던 외부자원을 돌려줘서 해제하는 작업.

- 예외발생 여부와 상관없이 돌려줘야함

- 생략되기도 함.

-try에 예외들을 다 몰아서 넣으면 맨 처음에 터졌을때 그 아래는 실행이 안될때 이건 꼭 써라~ 이런거.

 

프로젝트 11Day0의 클래스  ExceptionTest6

 

 


throws / throw 

throws  : Exception 처리를 내가 하지 않고 위임함.    -나를 호출한 함수에게 처리를 위임

ex)  public static a( ) throws Exception { ~ }    // 보통 함수( ) 뒤에 씀

throw  : Exception을 개발자가 강제로 발생시에 사용하는 키워드.

ex)  if ( num<10) {

             throw new Exception ("num이 10보다 작다") ;

            } 

 

ㄴ b( )에서 위임되어서 왔는데, a( )도 위임시켜서 main ( )으로 위임함

    근데 main( )도 throws 달아서 jdk한테 위임시킬 수 있음.

    jdk한테 위임 안할거면 main( )안에서 try-catch문 블럭을 꼭 잡아줘야함.

ㄴtry-catch문을 어디서 쓰는지에 따라 throws가 사용중단 되는지도 달라짐

 

ㄴthrows랑 trycatch문 같이 쓰면 상충되는건데도 에러가 뜨진 않음.

ㄴ이렇게 할땐 에러가 안 뜨고

   컴파일 에러? 뭐 할때는 에러가 뜬다캄

 

┌ 위임되는 순서┐

 

만약, a( )에 trycatch문을 써버린다면???

 

*잠시 쉬는시간.. 후.. 열심히 캡쳐정리했다.

 

 


책246쪽

<오버라이딩 할때 제약조건>

-메서드 리턴타입이 반드시 동일해야 된다.

-상속관계인 경우에 작은 타입으로.

throws 예외클래스는 계층구조에서 같거나 작은 타입만 가능하다.

 

 

┌오버라이딩 할때 제약조건┐

프로젝트 11Day0의 클래스 ExceptionTest10 

ㄴimport java.sql.SQLException; 임포트 하면 가능!

 


책248쪽

프로젝트 11Day0의 Ex09_7

만약 ' throws Exception '이 없다면 아래 에러가 뜨는데 Add하면 또 알아서 추가됨

 

 

*ExceptionTest11클래스. throws가 없어도 런타임 계열은 묵시적으로 실행이 됨


사용자 정의 예외클래스★꼭 기억하기

- 시스템이 제공하는 예외클래스 말고도,

   개발자 기준으로 '변수가 이거면 예외로 지정~'해서 쓸 수 있게 하기 위해서.

1. 반드시 Excepton 클래스를 상속extends 해야하며.

2. 일반적으로 문자열을 저장할 수 있는 생성자를 구현.

3. 문자열은 super를 이용해서 Exception 클래스에서 초기화.

┌클래스 생성             ┐ ┌Exception계열의 클래스가됨
public class UserException extends Exception {
   public UserException( String mesg ) { //생성사생성
       super( mesg );             └받아온걸①
   } └Exception클래스까지 전달시킴②
}

 

 

┌프로젝트 11Day0의 Ex09_8클래스┐

ㄴ사용자가 지정한 조건에 위배되는 경우임.

 

 

┌프로젝트 11Day0의 ExceptionTest12┐

ㄴmain함수가 UserException 타입으로 받아서 예외잡고 출력