에러 - 하드웨어의 잘못된 동작 또는 고장으로 인한 오류 - 에러가 발생되면 프로그램 종료 - 정상실행 상태로 돌아갈 수 없음
예외 - 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류 - 예외가 발생되면 프로그램 종료 - 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있음(중요)
예외의 종류 1. 일반(컴파일 체크) 예외 - 예외 처리 코드 없으면 컴파일 오류 발생 2. 실행 예외 - 예외 처리 코드를 생략하더라도 컴파일이 되는 예외 - 경험 따라 예외 처리 코드 작성 필요
예외 클래스 참고용 사진
NullPointerException - 객체 참조가 없는 상태 (null 값 갖는 참조변수로 객체 접근 연산자인 도트(.) 사용했을 때 발생 NullPointerException 참고 사진 ArrayIndexOutOfBoundsException - 배열에서 인덱스 범위 초과하여 사용할 경우 발생
ClassCastException - 타입 변환이 되지 않을 경우 발생
클래스 하나 만들어주시고
실행!
오류가 뜨는 게 정상입니다. 이걸 보려고 코드 친 겁니다.
여기서 args : 메인 메서드의 매개변수, 프로그램 실행 시 추가되는 실행 옵션을 배열로 받는 겁니다.
클래스 파일 우클릭 Run as -> Run Configurator ->
하고 Run!
이렇게 원하는 값이 나오게 됩니다.
ClassCastException
잘못된 형변환 때문에 생기는 오류입니다.
위에서는 chageDog를 썼는데 아래에 Animal로 Dog, Cat을 만들었습니다.
animal을 Dog로 강제 형 변환을 해주었지만 아래에서 changeDog에서 cat이 public static의
예외 처리 코드 - 예외 발생 시 프로그램 종료 막고, 정상 실행 유지할 수 있도록 처리 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로 마지막에 닫아주셔야 해서 사용했습니다.