Developer/JAVA

JAVA , Exception의 직접 처리와 위임 처리 , 사용자 정의 Exception

단님 2024. 9. 23. 00:04
728x90
1. 직접 처리 

해당 메서드 내에서 try ~ catch 블럭 처리
public static String readString1() {
	byte [] bf = new byte[100];
	System.out.println("readString1 ) 문자를 입력하세요.");
	System.in.read(bf);
	//컴파일 오류 : Unhandled exception…
}

 

Java의 system.in.read()메서드는 입력 스트림에서 바이트를 읽어들이는 과정에서 다양한 예외가 발생할 수 있기 때문에 이를 처리할 필요가 있다. 입력 및 출력 작업 중에 발생하는 예외로, 스트림이 닫혔거나, 입출력 장치가 사용 불가능한 경우에 발생 → IOException

system.in.read 는 IOException 을 던질 수 있기 때문에 try - catch 가 필요하다.

없다면 컴파일 오류가 발생한다.

IOException 은 Checked Exception 임으로 try—catch 가 필수.

public static String readString1() {
	byte [] bf = new byte[100];
	System.out.println("readString1 ) 문자를 입력하세요.");
	try {
		System.in.read(bf);
	} catch (Exception e) {
		System.out.println("catch , Exception(toString) : "+e.toString() );
//Exception 이라고 하면 괜찮으나 , runtimeException 으로는 대체가 불가하다 계보가 같지 않기 때문,
//정확하게 IOException ( 만약 IOException 으로 사용시 import 필수)

	}
	return new String(bf) ;
}

readString1() 의 실행
Exception 에 커서 두고 ctrl + T : 계보 확인

 

 

2. 위임 처리 (throws Exception)
Exception 처리를 상위 메서드로 위임(떠넘기기)
방법 : header 에 thows를 추가

떠넘겼을 경우 , 메인에서 메서드를 사용하게 될 경우 오류 발생.

메인 메서드의 사용시 try - catch를 의무 사용해야한다.

 

메인 메서드 또한 떠넘기기가 가능하다.

메임 메서드 내에서 발생할 수 있는 예외를 호출자(즉, JVM)에게 전달.

예외를 메인 메서드에서 직접 처리하지 않고, 해당 예외를 상위 호출자에게 위임한다.

	public static void main (String[] args) throws Exception {
		System.out.println("main ) readString 2 : "+readString2());
	}

예외를 직접 처리하지 않고 상위 호출자인 JVM에 예외를 전달한다.

이는 프로그램이 예외 상황에서 종료될 수 있음을 의미.

일반적으로 메인 메서드에서는 중요한 예외를 잡아서 사용자에게 적절한 메시지를 보여주거나 프로그램을 안정적으로 종료하기 위한 처리를 하는 것이 좋다.

 

런타임 오류의 Exception 처리에 대하여

java 의 컴파일러가 Exception 처리 확인하지 않음
즉, 반드시 try ~ catch 구문 을 적용하지 않아도 됨.
그러나 필요시엔 throws 로 처리 가능
상위의 메서드에서도 Exception 처리가 의무조항은 아님
즉, 반드시 try ~ catch 구문 구현 하지 않아도 컴파일 오류 없음.
public static void intByZero() throws ArithmeticException{
	int i = 10/0;
}//byZero
    
public static void arrayIndex() throws ArrayIndexOutOfBoundsException{
	int arr[] =new int[3];
	arr[3] =100;
}//ArrayIndexOutOfBounds

unchecked Exception 은 throws 했어도 call 한 메서드 내의 try-catch 구현은 의무가 아님

계속 상위로의 위임도 가능하다.

→ throws 했어도 try-catch 의 의무가 없음 . Exception 발생시 비정상 종료가 생김.

 

throw 생성
예외생성
throw : 예외(Exception) 생성하기 (사전던지다)
throws: 예외(Exception) 전달하기 (떠넘기기, 사전던지다)

 

  • Unchecked Exception 생성
System.out.println("program 시작");
throw new RuntimeException();

실행 후 비정상 종료

 

  • Checked Exception 생성
throw new Exception();

try catch 블럭안에 없다면 , checked Exception 임으로 바로 오류발생.

System.out.println("program 시작");
try {
	throw new Exception();			
} catch (Exception e) {
	System.out.println("catch block ,throw new Exception();,
	 Exception(toString) : "+e.toString() );
}
System.out.println("program 종료");

무조건 Exception을 일으키는 try구문으로 인해 catch 가 실행되고 정상 종료가 발생.

 

  • 조건을 활용하여 Exception 생성
내가 원하는 특정 상황에 대한 Exception 으로 정의 할 수 있음.
인스턴스를 정의 할 수 있고 , 일회적으로 사용한다면 인스턴스 없이 사용할 수 있다.

 

[ ✔️ 1 회적 사용의 Exception(none instance) ]

System.out.println("program 시작");
try {
	double result = 1.5/0.0 ;
	if(Double.isInfinite(result)) {
		throw new Exception("인자를 통한 message 입력도 가능하다 result = "+ result);
	}
	System.out.println("reult = "+result); //if 로 빠지면 실행되지 않음의 구문
} catch (Exception e) {
	System.out.println("catch block , Exception(toString) : "+e.toString() );
}
System.out.println("program 종료");

[ ✔️ 다회적 사용의 Exception (instance) ]

Exception myE = new Exception("인자를 통한 message 입력도 가능하다 result = "+ result);
throw myE ;

 

사용자 정의 Exception
1 . unchecked 할 것인지 checked 할 것인지 결정.
2 . Exception 정의 → 클래스 생성하여 Exception을 상속받는다.
3 . 생성자 메서드를 통해 정의하여 준다.

 

[ ✔️사용자 정의 Exception 정의 ]

//1 .unchecked Exception
class AgeException extends RuntimeException {
	private static final long serialVersionUID = 1L;
	public AgeException() {
		super("나이 값이 범위를 벗어남");
	}
	public AgeException(String s) {
		super(s);
	}
}
//2. checked Exception
class AgeExceptionck extends Exception {
	private static final long serialVersionUID = 1L;
	public AgeExceptionck() {
		super("나이 값이 범위를 벗어남");
	}
	public AgeExceptionck(String s) {
		super(s);
	}
}

 

[ ✔️메서드 정의 , 조건에 부합하지 않으면 사용자 정의 Exception 발생 ]

//1 .unchecked Exception
public static int readAge() {
	System.out.println("unchecked 나이를 입력하세요");
	int age =Integer.parseInt(sc.nextLine());
	if(age <19 || age> 50) throw new AgeException();
	return age;
}
//2. checked Exception
public static int readAgeck() throws AgeExceptionck{
	System.out.println("checked 나이를 입력하세요");
	int age =Integer.parseInt(sc.nextLine());
	if(age <19 || age> 50) throw new AgeExceptionck("점심 뭐먹지 ?");
	return age;
}

 

[ ✔️실행 - unchecked Exception ]

public static void main(String[] args) {
		readAge();
}

 

[ ✔️실행 - checked Exception ]

public static void main(String[] args) {
	try {
		readAgeck();
	}catch (AgeExceptionck e) {
		System.out.println("main -> AgeExceptionck :"+e.toString());
	}catch (Exception e) {
		System.out.println("main -> Exception :"+e.toString());
	}
}