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 ");
}
'Developer > JAVA' 카테고리의 다른 글
JAVA , 인터페이스 , 인터페이스와 추상클래스의 차이 (1) | 2024.10.28 |
---|---|
JAVA , Exception의 직접 처리와 위임 처리 , 사용자 정의 Exception (0) | 2024.09.23 |
JAVA , 열거형 클래스 enum ! (1) | 2024.09.21 |
JAVA , 추상 클래스의 다형성 보기 (1) | 2024.08.08 |
JAVA , 추상 클래스 (0) | 2024.08.08 |