본문 바로가기
JAVA

예외 처리

by 사브나19 2022. 8. 28.

프로그램 오류 3가지 

컴파일 에러: 컴파일할 때 나타나는 에러

런타임 에러 : 실행 할 때 발생하는 에러 

논리적 에러: 작성 의도와 다르게 동작

 

javac. exe 이게 자바 컴파일러이다. 원래 명령어로 해야 하는데 이클립스가 자동으로 해준다. 

자바 컴파일러가 하는 일은 번역이다. ( 구문체크, 번역, 최적화 )

 

 

심각한 오류는 에러 미약한 에러는 예외

최고 조상 밑에 Throwable은 신경쓰지 말고 그 밑에 Exception과 Error 가 있다. 심각한 오류 중 하나가 메모리 부족 오류로 out of Memory Error이고 미약한 오류는 크게 두 가지로 구분된다. Exception의 자손과  RuntimeException의 자손

 

 

위 사진 

Exception클래스와 자손들은 보통 외적인 요인에 발생하는 오류이다. 파일이 없다거나 입출력이 잘못된 오류  

RuntimeException 클래스와 자손들 클래스의 오류는 프로그래머의 실수로 발생하는 오류

산술계산이나 형변환의 오류 널 포인트 오류란  str에 널을 집어넣어 아무것도 없는데 이 str을 이용해 코드를 만들었다면 그건 널 포이트 오류라고 한다. (null)

 

우리가 심각한 오류는 대비 못하지만 미약한 오류 Exception과 RuntimeException은 대비하기위해 예외처리 코드를 작성한다. 

 

 

 

try는 예외가 발생할 문장을 넣고 catch에는 이를 처리하기 위한 문장을 넣는다. 

만약 쇼핑이라는 문장이 있다면 이를 try에 넣고 이에 발생할 수 있는 문제들 돈이 부족한다든지 물건이 없다던지 그런 것들은 catch안에 넣는다. 

catch 구문 중에 딱 한개만 실행된다. 그리고 빠져나간다. 

이 그림에서 봐야할 것은 모든 Exception의 최고 조상은 Exception e이다. 그래서 모든 예외 처리가 가능하고 이것은 catch 블록 중 제일 밑에 둔다. 

 

참고로 0으로 나누는 것은 오류이고 이럴때 처리하는 예외처리 코드가 ArithmaticException이다. 

 

예외가 발생하면

 

1) 예외 객체가 생성된다. 

2) 그 객체에 예외 정보고 넣어진다. 

3) 그 정보를 다루는 메서드가  pinrStackTrace(), getMessage() 등이 있다. 

 

즉 catch 블록을 만들 때 이 메서드를 서서 예외 정보를 알고 출력할 수 있다.

예) ae. printStackTrace();

     sysout(ae.getMessage())

 

 

 

내용이 같은 catch 블록인 경우 하나로 합친다. 중복 제거 !!

단 부모 자식 간의 경우 하나로 합치지 못한다. 사실 굳이 그럴 필요가 없다. 부모 자식 간의 경우 조상 타입 참조 변수만 써주면 되기 때문에 굳이 두 개 쓸 필요 없다. 

 

 

멀티 catch블록에서 유의할 점은 참조 변수가 가리키는 것이 공통된 것이어야한다. 

위의 그림처럼 참조변수 e가 둘 다 있는 것을 가리켜야 한다. 

만약  ExceptionA에 있는 것만 가리키고 싶다면 instanceof로 유효성 검사를 하고 ExceptionA대한 객체 생성 후 그 리모컨을 사용해서 메서드를 불러온다. 

 

예외를 발생시키는 방법 

1) 예외 객체를 만들고 Excetion e = new Exception("고의 발생");

2) 키워드 throw를 이용해 예외 발생 throw e;

이는  throw new Excetion("고의 발생");  한 줄로 표현 가능 

 

throw 되면 catch로 받는다. 일치하는 참조 변수 스타일을 찾고 그 참조 변수를 이용해서 catch블록 내에서 에러 내용을 불러온다. getMessage는 에러 내용을 보는 것이다

Exception 중 Exception (사용자 입력 오류 등 )과 RuntimeException (프로그래머 오류)가 있다고 했는데 

Exception은 checked 예외로 컴파일러가 예외 처리했는지 필수로 체크를 한다. 그래서 try catch문이 없다면 컴파일이 안된다. 반면 RuntimeException은 unchecked 예외로 컴파일러가 체크를 안 하기 때문에 오류가 나도 컴파일은 ok

총정리 내용은 아래 사진

 

 

'JAVA' 카테고리의 다른 글

예외 선언하기  (0) 2022.08.30
JAVA 복습 2  (0) 2022.08.29
내부 클래스  (0) 2022.08.28
추상 클래스 (abstract)  (0) 2022.08.27
JAVA 복습 1  (0) 2022.08.22

댓글