Developer/JAVA

Java , 예외 처리 Exception , try-catch

단님 2024. 9. 22. 00:35
728x90
자바의 예외처리 방식
자바에서 발생 가능한 오류 상황을 예외 처리의 객체로 만들어 현재 관리되고 있는 것이다.
필요하다면 , 그 오류에 대해서 대응하고 진행하는 방법에 대해 정의해 놓았다.
그에 대한 구문이 try - catch - finally

try {
    // 예외가 발생할 수 있는 코드
} catch (ExceptionType1 e1) {
    // ExceptionType1 예외를 처리하는 코드
} catch (ExceptionType2 e2) {
    // ExceptionType2 예외를 처리하는 코드
} finally {
    // 예외 발생 여부와 상관없이 항상 실행되는 코드
}

 

 

예외 처리에 대한 중요성
예외 처리는 프로그램의 안정성과 신뢰를 높이는데 중요하다.
적절한 예외 처리는 예기치 않은 상황에서 프로그램이 정상적으로 동작하거나 ,
사용자에게 유용한 피드백을 제공할 수 있게 한다.
자바의 예외처리 매커니즘을 이해하고 적절히 활용하면 , 보단 견고하고 유지보수하기 쉬운 코드를 작성할 수 있다.

 

자바의 예외 클래스는 java.lang.Throwable 클래스에서 시작된다.
그 하위엔 Exception 과 , Error 가 있다.
Exception : 어플리케이션 레벨의 오류로 프로그래머가 처리할 수 있는 문제를 나타냄.
Error : 시스템 레벨의 오류로 어플리케이션에서 처리할 수 없는 심각한 문제를 나타냄
     (예 시: 메모리 부족에러:OutOfMemoryError 등)

 

Exception
프로그램 코드에 의해 수습될 수 있는 오류
1. IOException : Checked Exception (반드시 예외 처리를 해야만 함.)
파일 및 입출력 작업에서 발생되는 Exception
컴파일 시에 확인된다.
2. RuntimeException : unChecked Exception (반드시 예외 처리를 하지 않아도 됨.)
개발자의 실수로 발생하는 Exception
컴파일 시에 확인 되지 않음.

 

 

RuntimeException의 예외처리 test

 

[✔️예외 처리 하지 않았을 경우 ]

int x = 6, y = 3 , result = 0;
String ss = "123000";
String [] names = {"김밥","오이","당근","시금치","우엉"};
result = x/0;
//=> 런타임 시의 오류

System.out.println("result ="+result);
System.out.println("program 종료");

➡️ 컴파일 오류는 발생하지 않지만 , 런타임시 오류 발생하여 비정상 종료를 확인 할 수 있다.

 

[✔️예외 처리 했을 경우 ]

try {
	System.out.println("result ( x/0 ) ="+result);
	System.out.println("result+=Integer.parseInt(ss) ="+(result+=Integer.parseInt(ss)));

} catch (Exception e) {
	System.out.println("catch ) exception : "+e.toString());
}finally {
	System.out.println("finally : 무조건 실행");
	System.out.println("result = "+result);
}

System.out.println("program 종료");

➡️try 의 구문에 에러가 있음으로 구문실행하지 않고

catch 로 갔다가 finally 진행이 되기에

result 값이 바뀌지 않았다.

여기서 catch를 제외하고 try - finally 를 사용한다면 Exception 에러가 남.

 

Exception 의 다향성 

exception : java.lang.NumberFormatException: For input string: "123000aa”
exception : java.lang.ArithmeticException: / by zero
exception : java.lang.ArrayIndexOutOfBoundsException
exception : java.lang.NullPointerException

다형성이 적용됨을 알 수 있다

모든 후손 exception 이 catch 블럭으로 전달된다.

그러므로 각 exception별 처리가 가능하다.

순차적으로 작은것 부터 걸러내야 내가 원하는 결과를 볼 수 있다.

최상위 객체 Exception 만 가장 밑에 정의해야 있으면 된다.

}catch (ArithmeticException e) {
			
}catch (Exception e) {
	System.out.println("catch ) exception : "+e.toString());	
}

 

실수형 연산의 NaN 처리
by Zero (나누기 0)
1. 정수 나누기 0 → Exception 발생. → 예외처리 대응 가능
2. 실수 나누기 0 → Exception 미발생. → wrapper Class로 대응
try {
	double d1 = 1.5 / 0.0; //Infinity 무한수
	double d2 = 1.5 % 0.0; //NaN 
	
	System.out.printf("try , 실수 d1 = %f , d2 = %f , d1 * 100 = %f %n" , d1 , d2 , d1 * 100);
} catch (Exception e) {
	System.out.println("catch , Exception : "+e.toString() );
}finally {
	System.out.println("finally , 무조건실행 " );
}
System.out.println("program 종료");

원하는 결과가 아닐 수 있다.

예를 들어 화면에 값을 계산하는데 NaN 또는 infinity가 나오면 말이 안되지 않을까 ?

Exception 이 아니기 때문에 시스템 중단이나 catch 블럭이 움직이지 않지만 ,

필요한 값이 아니기 때문에 처리가 필요하다.

 

wrapper class를 확인하여 if 문을 만든다

if(Double.isInfinite(d1) || Double.isNaN(d2)) {
	System.out.println("isInfinite , isNaN ");
}