[DAY24] 예외처리(Exception) , try-catch block

NA YE SOM·2023년 8월 1일
0


-> 우리가 해결할 수 있는 건 : exception
-> 해결 못하는 건 : error (컴퓨터가 좋지 않거나 메모리가 딸리거나.. 실행되다가 죽음 , out of memory ) -> 회사에서 서버를 증설해야함 (하드웨어 문제인 경우가 많음) 잘못되었을때의 대비책은 없음
if가지고 처리 못하는 경우

-> exception 위에 throwable있음
(thorwable : 던질 수 있다)



-> 반복문일경우, 반목을 못하고 죽어버림(예외처리 배우면, 잘못된 상황이 발생하더라도 잘못되었다는 메시지 띄우고 죽지 않을수 있음)


checked exception : 반드시 try- catch를 가져야함(없으면 실행을 안함)

unchecked exception : try-catch 없어도 동작하는 exception

-> 우리는 여기서만 했었음
(ex) nullpointexception = unchecked exception -> try -catch없어도 실행됨

unchecked 는 RuntimeException 으로 다 저장으로 가능(부모라서)
or
그냥 exception 으로 저장할 수도 있음

결론) 모든 예외는 exception (class명)으로 저장할 수 있음

★★★ 그림 중요!


-> 정상적으로 실행할 때 코드
-> 예외가 발생했을때 처리하기 위한 코드
분리해서


(정상) -> 1,2,3 코드 할때까지 문제 없으면 ) catch돌지 않음 -> try 만 함

★ 코드 흐름 체크(중요!)

(예외) -> 1,2번 -> 4번으로 곧바로 (catch)로 넘어감
-> catch


-> 예외처리방식 2개이상

-> 순차적으로 방문해서 2번째 catch 처리로 넘어감
-> 첫번째, 두번째 catch 둘다 처리를 못하면) 잘못 짠것

catch쪽으로 exception예외가 던져진다(
exception은 모든 예외의 부모임

try block으로 발생한 모든 예외를 exception으로 처리가능
-> dead code가 됨
-> 모든 예외처리를 첫번째할 수 있음

try쪽에서 예외를 주면
catch쪽에서 예외를 받는것(파라미터라고 생각)

exception 클래스가 모든 클래스의 "슈퍼"클래스이다.

exception은 모든 예외를 저장할 수 있음

RuntimeException - unchecked

Exception - checked (try-catch 필수)

-> I/O Exception 은 checked라서 try catch 없으면 코드가 실행이 안됨
-> network도 마찬가지

<보충>
Lambda(람다) -> Stream(스트림)(이어지는 수업)
-> 람다 문법이 스트림에서 어떻게 사용되는지 보여주는 수업
-> for문 없이 loop 돌릴 수 있음
-> 없어도 최종 final project에 영향 x

15_Exception


-> 이름 "tom"을 정수로 바꿔주라


-> NumberFormatException

catch 쪽에 numberformatexception 선언해놓고 처리할 수 있음

항상 ctrl + space 누르는 연습하기

예외 객체 이름 : e(관용적)

Numberformatexception 이 발생하면 자동으로 Numberformatexception 을 catch블록으로 자바가 던진다

Try block에서 생긴 모든 예외는 자바에 의해서 catch로 던져진다


->catch 블록 잘못만들면 안한거랑 똑같음

잘모르면 어떤 종류의 예외이건 Exception으로 저장하는 건 가능하다.

-> 여기다가 exception 적기

Exception이라고 적으면 모든 예외 처리가능

수업시간에 보여주는 예외 다 외울필요는 없음


-> try 쓰고 ctrl + space 누르면 exception 들어가있음


-> 예외가 처리됨

RuntimeException - 자식 Uncheckd exception

-> parseint 메소드를 호출할때 항상 numberformatexception 발생할 수 있지만
하지만 try catch 없어도 실행가능


-> 값만 잘 넣으면 잘 실행됨

try catch가 없어도 동작하는 코드 : unchecked exception: NumberformatException, Nullpoint exception, Indexoutofexception

내일부터 배울 I/O -> try catch 필수 : checked exception

ex02 멀티catch(다중 catch블록)


-> scanner쓰려면 import 필수


-> 모든 데이터가 system.in 통해서 들어감


-> 1+2 (String으로 , 공백 없으니까 : next())
공백없이 입력받기


-> 띄어쓰기하기!

split 정규식


-> split이라는 정규식 쓸거임

-> 배열의 형태로 저장되는 것


-> regex(regular expression: 정규식)

정규식에서 문자 하나 지정시) [대괄호]안에다가 적으면 "문자"로 이해함(문자 더하기로 이해함)




-> 문자열을 숫자로 바꿈


-> integer.parseInt는 언제나 numberformatexception 발생할 수 있음



-> 1.5 면 정수가 아니라서 예외발생
-> numberformatexception 발생 이유: 정수format이 아니라서


-> "1-2"가 들어가서 그냥 끝남
{"1-2"} 배열의 요소가 1개임

-> integer.parseInt(numbers[1]) 존재하지 않으니까 오류남

ArrayIndexOutOfBoundsException 사용할 수 있는 인덱스 범위 벗어났을때


-> + 를 가지고



catch여러개 만들겠다 = 예외 사유 적겠다(catch 발생할때마다 사유를 사용자에게 전달하겠다(사유가 명확해서 안내하기 위해서))

아니면 exception으로 묶음

이메일 contact. us


경고메시지 나타난 이유 : sc.close() 없어서

ex03 ★URL


malformedURLException
: unhandled exception 나오면 try - catch 하라는 거구나
-> try catch 없다고 빨간줄 뜸
-> checked exception


-> 예외 종류 공부하는것보다
반드시 try-catch가 필요한 예외를 checked excpetion이라고 한다.
-> 그냥 excpetion으로 받기

★(실무) 예외발생하면 발생한 것 파악 -> 예외 발생 안하기 위해서 무슨일이 중요한지 파악

ex02_finally 블록 추가


-> 정수 입력받을때 쓰는 메소드 : nextInt()


-> 입력받을때 정수가 아니면 오류를 뿜을 수 있음

예외처리하기


-> 정상실행했을때는 문제 x
예외 있을때는 문제가 있음

예외가 발생안하면 close를 함.


-> 예외가 발생하면 sc.close()를 못함


-> 예외 발생하면 age에서 바로 jump 해버림

다행히 여기서 sc.close()는 생략가능해서 오류가 발생하지 않은것 뿐


-> close위치가 여기있으면 안됨


-> 항상 마지막에 무조건 실행됨

오류 안나게 sc.close() 옮기기

* scope(스코프) : 범위 {중괄호}(중요)

: 어떤 변수가 여는 중괄호에서 닫는 중괄호 까지만 존재할 수 있다 (기준이 되는것)
변수가 언제 태어나서 언제 죽는지(life cycle) 볼 수 있다.
-> 안에서만 변수가 사용될 수 있음

sc가 선언된 블록은 try 블록
-> try 블록에서 선언한건 try 블록안에서만 쓸 수 있다.
-> ★★어느 {중괄호} 소속인지가 중요한것


-> scope 조정

try 밖으로 scanner 선언을 뺌


-> sc가 선언된 {중괄호} 는 메인 메소드 블록으로 커짐(사용범위 늘어남)


선언과 생성 분리

객체들의 초기값 null로 잡아주면


-> 선언 위치만 한단계 올라서 scope 조정


-> 자원 반납 할때 쓰는 용어 : close()

jdbc 접속 닫을때 쓰는 것 : finally 블록으로 처리할 것임

ex03_ throw 예외를 직접 생성해서 던질때 사용 -> 던질때: RuntimeException 만들어서 던지기


-> 생성 : new를 뜻함


-> 자바입장 : 예외 아님, 우리가 봤을때는 예외임 (문제가 있는것들)



-> 우리가 봤을때는 10000살이 없음


-> 그동안 return같이 예외 회피 한것


-> 예외를 던지면 catch가 잡아서 처리함


-> 우리가 직접 RuntimeException 을 만들어서 발생시킴

던지면 catch가 받아서 처리함

catch 예외 객체 ex01

지금까지는 system.out

예외 처리할때 객체가 어떤 역할을 수행할 수 있는지??


5/0 불가능 예외


-> Exception 의 부모로 object있으니까 활용가능



-> arithmetic 산술연산 예외

자바가 발생시킨 예외의 이유는 자바가 적어줌
우리가 발생시킨 예외는 우리가


-> string타입의 메소드 꺼내는 getter getMessage호출됨


-> 우리가 만든 예외도 확인하기


-> 메시지를 저장할수 있는 예외


-> 개발자가 예외 사유도 적음

-> 어떤 경우든 메시지 확인은 : getMessage() 호출

ex02


-> 호출이 null로 시작 인수가 null


-> null값은 메소드 부를 수 없음
-> null값이 메소드 부르면) NullPointException 임

Trace : 예외 추적

우리한테 필요한 건 예외를 찾아서 수정할 수 있게 추적하는것

-> ★개발할때는 그냥 그대로 띄우는 것이 좋음(왜 문제가 발생했는지)


-> 이건 도움이 되지 않음(어디서 발생했는지 알 수 없음)

★printStackTrace() : 예외 추적 문구를 강제로 출력하기

try catch없을때 살펴볼 수 있는 예외 추적 문구가 다시 나옴



-> ★예외처리하세요
try - catch 하고
catch(Exception e)안에다가 printStackTrace(); 하면 됨

만들고 전달해야하는데 어느순간 안만들고 전달하는 경우도 있음
(다 nullpointexception 떨어짐)

try catch없을때 저게 나오면 추적하겠다는 건데
앞으로 checkedexception은 try -catch무조건 넣어야 하는데
try-catch넣으면 예외 추적이 안됨
-> 둘다 하기 위해서 쓰는것

API 개발 경우, 메시지를 만들어야하는 경우가 있음


-> 메소드 호출, 정의 체크하기!

★★★(중요) throws : 메소드에서 발생하는 모든 예외를 던질 때 사용한다.


-> 메소드에 예외가 있는데 그 예외를 메소드가 처리하지 않는다.


-> try catch를 없애는 대신에

-> ex02() 호출하는곳으로 try-catch를 옮기는것을 함


-> 예외처리를 미루는 것 (나 예외처리 안하겠다)

메소드 print

첫번째 글자, 나머지 글자 분리


-> 0은 포함, 1은 불포함( 1번 인덱스 이전까지 = 첫글자만 )

-> 인덱스 1개(끝까지 출력)



-> NullPointerException


-> 평소에는 ) 저기다가 try-catch넣음

but



-> nullPointeException : java.lang패키지라 import x

이 print exception 실행시 NullPointeException이발생할 수 도 있다.

★호출할때 예외처리! (난 안하고 예외처리 미룸)


-> getMessage : (자바가 만든) 예외메시지

print 호출하는 사람들아 NullPointException 처리해라


이 메소드를 적으면 try catch 안하겠다는것(일반적으로)


-> 예외발생할 수 있지만 trycatch안넣음

(예외를 던지는애들은 trycatch없음)
(try catch - parseInt 호출할때 함)


본문에 try -catch 함


-> java doc. 만들때 ) throws도 작업가능
(ex) 나이 0보다 작거나 .. 등등

NullPointException아니면 본문에다가 Try- Catch 넣을 수 있다.


-> (입금) 예외발생 거리가 있음
{입금하려고 돈 받아올때 돈이 0보다 작으면 예외임 )

-> (출금) 예외발생

생성방법 : 통장잔액, 계좌번호 입력받는방법으로만들기(source가서)




-> copy해오기


-> 예외를 만들어야함 (0보다작은값이 전달되었다해도 자바가 예외로 생각하지 x)


-> -도 long이니까 자바가 잡아내지 못함


-> 만들때는 RuntimeException


-> 예외메시지


-> try-catch없음

-> trycatch없는데 예외발생은 내가 안하고 나를 호출하는곳으로 보내겠다는것

-> throw문이 try에 들어가있음, throw문에서 발생한 예외는 catch가 처리함


-> 뭘로 받을까?


-> 예외메세지보여줌





-> 출금 메소드 copy



출금을 try~catch로 묶기


-> long타입의 retval변수가 Try블록 안에 들어가있음
출금 메소드 입장에서 trycatch밖에 자기가 가지고 있는 코드가 없음
-> return 없음
-> scope의 문제



-> 한칸위로 빼고

선언된 반환값있고

-> get 메시지에 의해서 꺼내지고 보여짐


-> 예외가 발생하면 ) 실제로 반환되는 값 : 0
(실제로 출금된 금액 : 예외 발생하면 0을 발생 = 실제로 출금된 금액이 없어서)



-> 반환값 있으니까


deposit은 자기가 예외처리함
withdrawl 호출시 자기가 예외처리함
-> 알아서 하는 애 2명을 부름
-> 할일이 없음


입금, 출금에 다 try-catch있어서

catch블록이 자주 나옴

-> 동일한 구조의 try-catch가 많이 나올 수 있는 구조


throws Runtimeexception으로 던짐



1. try -catch 빼기 2. throws 붙이기
★★★ try catch를 내가 하지 않겠다


-> try catch가 안되는 상황
-> try catch 붙이기

각 계좌의 입금, 출금해보기

입금이 runtimeexception 던졌는데 왜 여기서 try-catch안했음

이체 try-catch 메인 try-catch
try,catch를 메소드마다 다 하겠다 하면
메소드에서 예외처리를 안하겠다 -> 내 예외는 던지겠다(thorws run~)
하면
try -catch가 여기저기서 나오면 안됨

try-catch 지우고 위에서 던져지는애들 있으면


나도 던짐 (받자마자예외를 처리해야한다는 규칙 x)
-> 다시 던져버림(문제 없음)

모든 메소드에 예외 던지는 것은 있지만 ,try-catch는 하나도 없음
(모든 메소드에서 try-catch는 제거함)


-> 예외처리는 나도 안할거임

★★★ 중요함!(위의 구조)

<중요한 이유>

  • 목록반환

    -> 데이터베이스 접근시에는 100% try-catch
  • 조회

-> 방금 배운걸로 쓰지 않으면) 메소드마다 try-catch가 넘쳐난다


-> 나를 호출하는 곳으로 다 던져서

거기서 한번만 하면 됨

bank - unchecked 라 try-catch가없어도 잘 되었던 것

try-catch가 있어야 할 자리에 있어야 함.
thorws도 있어야 할 자리에 있어어 함.

★★★ throws : 메소드에서 예외를 던지고 던질때) 받아서 처리하는 것!

<8/2시험>
(범위 : ~ ArrayList까지, 입력 Scanner도 나옴)

import 함 -> class3개 (2개는 완성, 1개는 속이 비어있는 메소드)
4개(10점)

60점

채웠는데 동작을 하면 +10점
채웠는데 동작을 안하면 +5점


(시험) 주차장에 차 넣기, 빼기, 차량 조회하기, 등록된 전체차량 조회하기

-> (유사한 문제)
도서관에 책넣기 문제를 풀어볼 것임

DB(database)없이
CRUD를 모두 해볼 수 있는 연습문제들
입력, 수정, 삭제 모두 담고있는 예제들

ex02_Soldier

throws 활용

Gun class
(총알이 최대 50발 들어갈 수있는데 그 이상 장전하려고할때)
reload


-> systemout에 있던 메시지를 예외메시지로

F2 이름바꾸기

-> 예외처리해보기

1.예외 던지기(throws) - reload


2.예외 던지기(throws) - shoot


-> soldier의 reload 본문으로 감
(여기서 try -catch하지 말고 나도하기싫어 처리)


-> soldier의 reload호출하는 곳 : mainWrapper

gun 던지고 soldier가 하기싫어서 던지거 main이 받음
-> main이 하기싫은거 던질 수 있음
-> 나도 하기 싫어 하고


-> main이 예외를 던지면 java virtual machine 자바가 예외처리함

try-catch 단한줄도 안적을수 있음



-> 예외로 처리해서 밑에는 코드가 안돌고 멈춘상황

메인에서 던지지는 않을예정

ex03_Bakery(12장 - 3번)


예외를 만들면 -> 예외 클래스 만들기(수업은 함, 하지만 프로젝트에서는 써먹지X)

메시지도 저장시키고 예외코드도 만들어서 함께 저장을 시키면 예외상황에 따라서 코드도 분리할 수 있는 작업도 가능함
-> 안배운 문법 추가로 학습해야함

-> 방금 Bakery에서 던진건 전부다 bakery.sell로 감

(1) try-catch로 밑에다가 처리하는 방법
(2) 여기서도 던지는 방법


-> 구매 불가합니다. 한것과 bakery.sell에서 받은거 전부다 RuntimeException으로 던짐

(예외상황)
빵을 -개 구매하겠다

빵의 -구매는 처리가 안되었음


-> 추가하기

profile
개발자 velog

0개의 댓글