본문 바로가기
JAVA Basic

공부 16일차) 예외처리

by 넴넴L 2023. 1. 18.
728x90

이제 자바 기초도 얼마 남지 않았네요

아마 이 글 합쳐서 2개가 끝이 될 거 같네요

자바 웹 공부를 같이 하다보니 얘를 올려야 한다는 걸 계속 까먹게 됩니다..

끝까지 화이팅 해보자구요

 

에러
- 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
- 에러가 발생되면 프로그램 종료
- 정상실행 상태로 돌아갈 수 없음

예외
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
- 예외가 발생되면  프로그램 종료
- 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있음(중요)
예외의 종류
1. 일반(컴파일 체크) 예외
- 예외 처리 코드 없으면 컴파일 오류 발생
2. 실행 예외
- 예외 처리 코드를 생략하더라도 컴파일이 되는 예외
- 경험 따라 예외 처리 코드 작성 필요

 

예외 클래스 참고용 사진

NullPointerException
- 객체 참조가 없는 상태
(null 값 갖는 참조변수로 객체 접근 연산자인 도트(.) 사용했을 때 발생
NullPointerException 참고 사진

ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위 초과하여 사용할 경우 발생

ClassCastException
- 타입 변환이 되지 않을 경우 발생

 

클래스 하나 만들어주시고

실행!

오류가 뜨는 게 정상입니다. 이걸 보려고 코드 친 겁니다.

여기서 args : 메인 메서드의 매개변수, 프로그램 실행 시 추가되는 실행 옵션을 배열로 받는 겁니다.

클래스 파일 우클릭 Run as -> Run Configurator ->

하고 Run!

이렇게 원하는 값이 나오게 됩니다.

 

ClassCastException

잘못된 형변환 때문에 생기는 오류입니다.

위에서는 chageDog를 썼는데 아래에 Animal로 Dog, Cat을 만들었습니다.

animal을 Dog로 강제 형 변환을 해주었지만 아래에서 changeDog에서 cat이 public static의

animal에 들어가서 Dog로 바꿔주려고 하니 에러가 뜨는 겁니다.(Cat을 Dog로 바꾸려고 해서)

그래서 코드를 고쳐주시면

이게 예외 처리가 됩니다.

 

예외 처리 코드
- 예외 발생 시 프로그램 종료 막고, 정상 실행 유지할 수 있도록 처리
1. 일반 예외 : 반드시 작성해야 컴파일 가능
2. 실행 예외 : 컴파일러가 체크해주지 않으며 개발자 경험 의해 작성
- try - catch - finally 블록 이용해 예외 처리 코드 작성
예외 처리 코드 참고용 사진

코드로 이해해보러 가시죠 클래스 하나 만들어 주시고

이걸 실행해보겠습니다.

엥 프로그램 정상 실행 완료가 실행되지 않습니다.

그렇다고 해서 try catch를 없애도 오류가 뜹니다.

 

일부러 오류를 만들어 줬습니다.

이러면 실행이 되지 않지만

이렇게 하면 실행이 됩니다.

// 이거 1시간 20분 정도에 확인해보자 이유

 

다중 catch
- 예외 별로 예외 처리 코드 다르게 구현

Exception은 예외 최상위 클래스로 발생하는 모든 오류에 대해서 처리가 가능.
catch순서는 상위 클래스가 아래 위치해야 한다.

클래스 하나 만들고

코드를 추가해 주세요

여기서 Run as -> Configu ->에서 숫자를 넣어주고 Run을 해주면

이렇게 나옵니다. 이건 저도 신기하네요

 

이렇게 코드를 더 넣어주고 실행해 주면 

잘 나옵니다.

참고로 finally부분은 오류가 나던 안 나던 무조건 실행되는 부분입니다.

try catch가 없다면 오류가 나서 실행이 되지 않습니다.

하지만 너무 깁니다. 한 번 줄여봅시다.

 

2개짜리를 catch를 2번 사용해서 하나의 코드로 바꿨습니다.

실행도 똑같이 됩니다.

 

만약 configurator에 나눌 때 0을 넣었다면 오류가 발생됩니다.

이렇게 넣고 실행하면 실행이 되고 오류가 뜨지 않게 됩니다

 

이렇게 다중 catch문 사용 시 Exception을 가장 먼저 사용하면 Exception이 최상위 예외 클래스 이므로 모든 예외를 처리할 수 있기 때문에 아래에 입력한 다른 예외를 처리할 수 없습니다.

그래서 중간에 쓰면 아무런 문제 없이 사용할 수 있죠

 

멀티(multi) catch
- 동일하게 처리하고 싶은 예외를 | 로 연결

저기 빨간 부분이 만약 같은 의미라서 합쳐서 하고 싶다?

빨간 부분처럼 합쳐주면 됩니다.

 

자동 리소스 닫기
- try-with-resources
1. 예외 발생 여부와 상관 없음
2.사용했던 리소스 객체의 close() 메소드 호출해 리소스 닫음
3. 리소스 객체
- 각종 입출력스트림, 서버소켓, 소켓, 각종 채널
- java.lang.AutoCloseable 인터페이스 구현하고 있어야 함

finally구문 : 예외 발생에 상관없이 실행, 자바의 내부리소스의 경우 자동 삭제가 됩니다.

하지만 외부리소스(파일, 네트워크)는 메모리가 자동 삭제 되지 않습니다.

 

클래스 하나 만들고

폴더명 아무거나 + 파일이름 txt는 아무이름으로 만들어주세요

저는 이렇게 만들었습니다.

 

txt 파일에는 그냥 hi라고 적어놨고요

실행을 해주니

104, 105가 뜹니다.

FileInputStream은 파일 내용 가져오는 함수입니다.

read는 파일 내용을 읽는 함수이고 -1이 아니면 계속 파일을 읽습니다.

여기서 -1은 아무것도 없는 데이터입니다. 아무것도 못 읽을때 까지 계속 화면에 출력을 시켜줍니다.

write(i)나 println(i)나 똑같습니다.

finally아래에서 input.close()를 쓰는데  close로 마지막에 닫아주셔야 해서 사용했습니다.

 

저도 예외 처리 부분은 이해도 많이 못해서 설명이 많이 부족하지 않았나 싶네요

오늘도 고생많았습니다!