1. 사용자 정의 예외 클래스 생성 방법
1) 사용자 정의 예외 클래스 작성
- Exception을 상속해 일반 예외 클래스로 만드는 방법
class MyException extends Exception {
MyException() {
}
MyException(String s) {
super(s); //부모 생성자 호출
}
}
- RuntimeException을 상속해 실행 예외 클래스로 만드는 방법
class MYRTException extends RuntimeException {
MyRTException() {
}
MyRTException(String s) {
super(s); //부모 생성자 호출
}
}
- 기본 생성자
- 문자열을 입력받는 생성자
-> 예외 메시지를 전달받아 예외 객체를 생성하는 생성자
-> 내부에서는 부모 클래스인 Exception 또는 RuntimeException 클래스의 생성자를 호출해 사용
2) 사용자 정의 예외 객체 생성
- 예외 클래스로 예외 객체 생성
MyException me1 = new MyException();
MyException me2 = new MyException("예외 메시지");
MyRTException mre1 = new MyRTException();
MyRTException mre2 = new MyRTException("예외 메시지");
3) 예외 상황에서 예외 객체 던지기
- 예외 상황이 발생하면 생성한 객체를 던진다(throw)
- 던진다(throw) = 실제 자바 가상 머신에게 예외 객체를 만들어서 전달
- 예외 객체를 던지면 곧바로 예외가 발생
- 자바 가상 머신은 그 예외를 처리할 수 있는 catch(){}블록에게 받았던 예외 객체를 전달
- 'throw 예외 객체' 형식
- throw 키워드
= 예외 객체를 던지는 기능을 수행
cf> throws 키워드
= 예외를 상위 메서드로 전가
throw me1;
throw me2;
throw new MyException();
throw new MyException("예외 메시지");
throw mre1;
thorw mre2;
throw new MyRTException();
throw new MyRTException("예외 메시지");
- throw로 예외를 던지면 곧바로 예외가 발생하므로 적절한 예외 처리 구문을 반드시 작성해야함
- 방법 1. 예외를 해당 메서드 안에서 직접 처리
-> 자바 가상 머신이 전달받은 예외 객체를 해당 메서드 내의 예외 처리 블록으로 전달
void abc(int age) {
try{
if(age>=0)
System.out.println("정상값");
else
throw new MyException(); //MyException 발생
}catch(MyException e) {
System.out.println("예외 처리"); //예외 처리 구문 수행
}
}
void bcd() {
abc(-2);
}
- 방법 2. 예외를 상위 메서드로 전가해 예외 처리
-> 예외 객체를 상위 메서드 내의 예외 처리 블록으로 전달할 것
void abc(int age) throws MyException { //예외 전가
if(age >= 0)
System.out.println("정상값");
else
throw new MyException(); //MyException 발생
}
void bcd() {
try{
abc(-2);
} catch(MyException e) {
System.out.println("예외 처리"); //예외 처리 구문 수행
}
}
package UserException;
//1.사용자 일반 예외
class MyException extends Exception {
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
//2.사용자 실행 예외
class MyRTException extends RuntimeException {
public MyRTException() {
super();
}
public MyRTException(String message) {
super(message);
}
}
class A {
//3.사용자 정의 예외 객체 생성
MyException me1 = new MyException();
MyException me2 = new MyException("예외 메시지 : MyException");
MyRTException mre1 = new MyRTException();
MyRTException mre2 = new MyRTException("예외 메시지:MyRTException");
//4.예외 던지기(throw) : 던진 시점에서 예외 발생
//방법 1. 예외를 직접 처리
void abc_1(int num) {
try {
if(num>70)
System.out.println("정상 작동");
else
throw me1; //예외를 던진 시점에 예외 발생
}catch(MyException e) {
System.out.println("예외 처리 1");
}
}
void bcd_1() {
abc_1(65);
}
//방법 2. 예외 전가
void abc_2(int num) throws MyException {
if(num>70)
System.out.println("정상 작동");
else
throw me1; //예외를 던진 시점에 예외 발생
}
void bcd_2() {
try {
abc_2(65);
}catch(MyException e) {
System.out.println("예외 처리 2");
}
}
}
public class UserException {
public static void main(String[] args) {
A a = new A();
a.bcd_1();
a.bcd_2();
}
}
2. 예외 클래스의 메서드
- 사용자 정의 예외 클래스는 Exception 또는 RuntimeException 클래스를 상속
- 추가 메서드를 정의하지 않아도 부모 클래스의 메서드를 고스란히 내려받음
1) getMessage() 메서드
- 예외가 발생했을 때 생성자로 넘긴 메시지를 문자열 형태로 리턴하는 메서드
- 원형
public String getMessage()
- 예외 객체를 생성했을 때 메시지를 전달하지 않았을 경우
try {
throw new Exception();
} catch (Exception e) {
System.out.println(e.getMessage()); //null
}
- 예외 객체를 생성했을 때 메시지를 전달했을 경우
try {
thorw new Exception("예외 메시지");
} catch(Exception e) {
System.out.println(e.getMessage()); //예외 메시지
}
2) printStackTrace() 메서드
- 예외 발생이 전달되는 경로, 즉 예외가 전가된 과정을 한눈에 확인할 수 있는 메서드
- 원형
public void printStackTrace()
- 클래스 A에는 3개의 메서드가 있고 cde() 메서드 내부에는 NumberFormatException이 발생하는 코드 포함
- 모든 예외는 상위 메서드로 전가(throws)하고 있음
package UserException;
class A {
void abc() throws NumberFormatException {
bcd();
}
void bcd() throws NumberFormatException {
cde();
}
void cde() throws NumberFormatException {
int num = Integer.parseInt("10A"); //NumberException 예외 발생
}
}
public class UserException {
public static void main(String[] args) {
//1.객체 생성
A a = new A();
//2. 메서드 호출 + 예외 처리
try {
a.abc();
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
}
- cde() 메서드에서는 NumberFormatException 에외가 발생하며, 이를 bcd() 메서드로 전달하고,
이후 다시 abc() 메서드를 거쳐 main()메서드까지 전달됨
- printStack() 메서드를 호출 -> 최초로 예외가 발생한 위치에서 해당 예외가 전달된 경로 확인 가능
- Integer.parseInt() -> cde() -> bcd() -> abc() -> main() 순으로 출력
3. 사용자 정의 예외 클래스의 사용 예
- 점수를 저장하는 scroe 변수에는 정수 0부터 100까지만 대입할 수 있으며, 이외의 값(음수,100보다 큰값)을 대입했을 때 일반 예외 발생
- score 값이 음수 => MinusException 클래스
- score 값이 100을 초과 => OverException 클래스
- 정수가 음수일 때 발생시킬 예외 클래스
class MinusException extends Exception {
MinusException() {
}
MinusException(String s) {
suoer(s); //부모 생성자 호출
}
}
- 점수가 100을 초과할 때 발생시킬 예외 클래스
class OverException extedns Exception{
OverException() [
}
OverException(String s) {
super(s); //부모 생성자 호출
}
}
- 점수가 0 ~100 범위가 아닐 때는 예외가 발생하는 checkScore()메서드를 갖는 클래스 A
=> 두 예외를 모두 상위 메서드로 전가
class A {
void checkScore(int score) thorws MinusException, OverException {
if(score<0) {
throw new MinusException("예외 발생 : 음숫값 입력");
}
else if(score > 100) {
throw new OverException("예외 발생 : 100점 초과");
}
else {
System.out.println("정상적인 값입니다.");
}
}
}
- A 객체의 checkScore() 메서드 호출로 발생하는 예외에 대한 예외 처리
=> main() 메서드에서는 A 클래스의 객체를 생성해 checkScore() 메서드를 호출
=> 다중 예외 처리 구문을 이용해 예외 처리
public static void main(String[] args) {
A a = new A();
try {
a.checkScore(85); //정상적인 값입니다
a.checkScore(150); //예외 발생 : 100점 초과
} catch (MinusException | OverException e) {
System.out.println(e.getMessage());
}
}
package UserException;
//정수가 음수일 때 예외 발생
class MinusException extends Exception {
public MinusException() {
super();
}
public MinusException(String message) {
super(message);
}
}
//정수가 100점을 초과할 때 예외 발생
class OverException extends Exception {
public OverException() {
super();
}
public OverException(String message) {
super(message);
}
}
class A {
void checkScore(int score) throws MinusException, OverException {
if(score < 0) {
throw new MinusException("예외 발생: 음숫값 입력");
}
else if(score > 100)
throw new OverException("예외 발생 : 100점 초과");
else
System.out.println("정상적인 값입니다.");
}
}
public class UserException {
public static void main(String[] args) {
A a = new A();
try {
a.checkScore(85);
a.checkScore(150);
}catch(MinusException | OverException e) {
System.out.println(e.getMessage());
}
}
}
'Java' 카테고리의 다른 글
15 -2장 쓰레드의 생성 및 실행 (0) | 2023.06.14 |
---|---|
15 - 1장 프로그램, 프로세스, 쓰레드 (0) | 2023.06.13 |
14 - 3장 예외 전가 (0) | 2023.06.13 |
14 - 2장 예외 처리 (0) | 2023.06.13 |
14 - 1장 예외 (0) | 2023.06.12 |