-
파이썬 아니고 자바 기초 입니다.
-
-
-
# 예외는 2종류
1. 일반예외 (Exception)
2. 실행예외 (RuntimeException)
# 자바는 예외를 클래스로 관리한다!!!
# 예외의 최상위 클래스는 Exception클래스이다.
# 모든 예외 클래스는 Excetption클래스의 상속을 받고 있다.
-
-
직접 예외 처리
- try ~ cathch
- finally
== 실습==
현 상황에서는 전혀 문제가 없는 코드 이다.
사용자가 n2 변수 값을 0 으로 초기화 할 경우 에러가 발생한다.
예외처리란 지금은 문제가 없는 코드이지만
예외가 발생할 가능성이 있는 코드에 try ~ catch로 에러 예외 처리를 해주는 것이다.
프로그램이 에러 발생 코드에서 멈춘 후 다음 코드로 진행되지 않고 에러를 출력하며 멈추는 것을 막아준다.
3번 코드 시작 부분 부터 끝까지 try{ } 로 감싼 후 try 블록이 끝나는 지점에
catch (){} 를 작성해준다.
catch 소괄호 안에는 처리할 예외에 대한 클래스와 매개변수를 작성해 준다.
e는 예외에 대한 에러가 발생했을 때 그 내용을 담는 변수 이다.
3번 코드에서 에러 발생시 예외처리를 해주어 프로그램이 멈추지 않고 끝까지 작동 되었다.
- 예외 처리시 catch에 작성한 예외 클래스가 에러내용과 일치하지 않으면 예외 처리가 되지 않는다.
-
- 정확한 에러를 모른다면 모든 예외의 상위 클래스인 Exception으로 예외 처리 해준다.
e.printStackTrace(); 으로 예외 처리 후에 예외 로그를 볼 수 있다.
e.getMessage(); 로 예외 전체로그가 아닌 예외 원인 메시지만 확인 할 수 있다.
== 다중 예외 처리
- 위의 코드에서 에러가 날만한 코드는??
n1의 값 입력 받는 코드
n2의 값 입력 받는 코드
n1/n2를 실행하는 코드
sc.close(); 총 4군데 에서 에러가 발생 할 수 있다.
sc는 Scaner sc = new Scaner(System.in) 으로 생성된 스캐너 클래스의 객체 이다.
스캐너 클래스가 null이 되면 close() 메서드를 실행할 수 없어 에러가 발생 한다.
nextInt의 예외 클래스들
에러 상황이 발생하는 코드들의 영역을 잡고 ctrl + alt + t를 누르고 6번의 try/catch로 예외 처리를 한다.
위에서 말한 것처럼 에러 발생이 예상되는 코드들
4개의 에러 발생 예상 코드를 묶어서 try catch로 예외처리를 하였다.
n2에 0을 입력하였을 때 를 대비하여 에러 발생시 "0으로 나누면 안됩니다." 출력되게끔 만들었다.
문제는 n1에 정수가 아닌 String을 입력할 때도
n2에 0이 입력 되어 발생하는 에러 메시지가 출력 된다는 것이다.
이럴때 모든 코드에 catch로 구체적인 에러 클래스를 설정해주고 그에 맞는 출력 메시지를 설정하면 된다.
--
- n2에 0을 입력했을 때 예외 처리한 대로 메시지 출력
- n2에 문자열을 입력했을 때 예외 처리한 대로 메시지 출력
sc를 null로 초기화 했을 때
예외 처리한 대로 메시지 출력
else if문 처럼 해당 발생하는 에러가 일치하는 클래스에서 예외 처리하게끔 처리하고
구체적으로 작성된 예외 클래스와 일치하지 않는 경우에도
else 문처럼 예외의 제일 상위 클래스인 exception으로 예외 처리를 한다.
단,
제일 상위 클래스인 Exception이 catch 맨 위나 중간에 있을 경우 Exception 다음에 있는 예외 문들에 문제가 생긴다.
== finally
배열 인덱스 이상으로 for문을 돌려 일부러 에러를 발생 시켰다.
에러 발생.
에러 발생 예상 코드에 예외 처리를 했을 경우
"애완동물 조아요"는 마지막에 출력 되지 않고 프로그램 정상종료만 출력된다.
println으로 예외 처리후 강제적으로 나올수 있게 할수는 있지만...
finally를 사용 하면여 애완동물 조아요 문구는 무조건 출력 될 수 있도록 할 수 있다.
-
-
== 예외 떠넘기기 throws 사용
- 정수를 입력받는 기능을 갖는 메서드 만들기
- 실수를 입력받는 기능을 갖는 메서드 만들기
메인 클래스에서 실행
- 정수를 입력받는 메서드에 실수를 입력했을 때 에러가 발생.
실수를 입력받는 메서드에 문자를 입력 했을 때 에러가 발생
메서드에 trt catch로 예외처리를 할 수 있지만 번거롭다.
EasyScanner 클래스의 메서드에 try ~ catch의 번거로움을 이 메서드를 호출하는 곳으로 미루겠다.
메서드 매개변수 작성란 괄호 뒤에 throws 예외클래스명 { 으로 작성해준다.
실수 입력 메서드에도 throws 처리
미스매치 예외클래스가 아닌 제일 상위 클래스인 Exception 으로 다시 throws 처리 해보았다.
이때 메인에서 메서드 실행란에 문제가 발생한듯 보인다.
이 문제는
메서드 실행하는 코드부에 try ~ catch 처리를 해주면 해결 된다.
메서드에 try ~ catch를 해주지 않고 메서드를 호출하는 곳에서
try ~ catch를 처리하도록 한다.
throws 는 catch (예외 클래스 , 매개변수) { 뒤에
throw new RuntimeException(e)를 써주지 않는다. 이거는 자동완성되서 돌려서 이렇게 됐어요 ..;;}
throw new RuntimeException(e)를 빼고 다시 실행 해보았다.
== throws 와 throw
Account 클래스에 출금기능 메서드를 만들었다.
메인에서 실행
잔액 필드가 초기값 0원으로 설정 되어 있으므로 메서드가 실행 되지 않는다.
사용자 입장에서는 전혀 문제가 되지 않지만...
비즈니스나 프로그램상 심각한 문제가 될수도 있다.
return 보다 더 강력하게 문제를 인식 시켜 주고 싶을 때는?!
throw 로 새로운 에러를 발생시켜 프로그램을 강제 종료 시킨다.
Account 클래스에 있는 withdrao 메서드에 예외떠넘기기 설정
잔액이 송금할 금액보다 작을 경우
throw new Exception(에러메시지)를 실행 시켜 프로그램을 강제 종료 시킨다.
메인에서 withdraw를 호출할 때 try ~ catch 처리를 해줘야한다.
- 던지기 : Exception ㅋㅋㅋ
호출 부에서 try ~ catch 처리를 하엿다.
메인부에서 메서드 실행시 조건이 충족되지 않아 메서드에서 설정한 throw의 에러 메시지가 출력되면서
프로그램 강제종료.
= 사용자 예외 클래스 만들기
클래스명은 알아볼수 있도록 센스 있게 지을 것.
- 예외 클래스는 예외의 상위 클래스인 Exception을 상속 받고
기본 생성자
문자열을 부모에게 전달할 생성자를 만들면 된다.
이전에 계좌이체하는 메서드에 throw 를 Exception 에서
사용자가 만든 BalanceInsufficientException 으로 바꾸었다.
이런식으로 사용 하면 된다.
'JAVA' 카테고리의 다른 글
java_인터페이스(실습예제)_22.06.14(day16) (0) | 2022.06.14 |
---|---|
java_인터페이스_22.06.14(day16) (0) | 2022.06.14 |
java_추상 클래스(실습예제)_22.06.13(day15) (0) | 2022.06.13 |
java_점검문제(OOP)_22.06.13(day15) (0) | 2022.06.13 |
java_추상 클래스(abstract calss)_22.06.13(day15) (0) | 2022.06.13 |