예외처리 (Exception Handling)
- 예외 : 일반적인 코드수행 중 발생한 예상치 못한 상황
- 예외처리 (Exception Handling) : 예외가 발생했을 경우 해당 상황을 수습하고 정상적인 흐름으로 되돌리는 기법.
1) try-catch-finally
- try : 예외 발생 가능한 곳
- catch : 내부에서 발생할 수 있는 예외 (여러 개의 catch문도 가능)
> 두가지 예외 블럭이 동시에 만족되는 상황에는 먼저오는 블럭이 먼저 실행.
> 서로 다른 예외지만 동일하게 처리하고 싶을 때는 |로 하나의 catch문 안에 넣을 수 있음.
- catch {} : 예외 발생시 실행되는 코드. (e.getMessage() 활용하여 예외 발생 코드가 작성한 메시지 확인 가능)
- finally : 예외가 발생하든 안하든 실행하고 싶은 코드가 별도로 있다면 추가.
public class ExceptionHandling {
public static void main(String[] args) {
int a = 10;
int b = 0;
System.out.println(divide(a, b));
System.out.println("Bye!");
}
public static int divide(int a, int b) {
return a / b; // b==0이기 때문에 ArithmeticException 발생.
}
}
// try-catch문 사용
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
System.out.println(divide(a, b));
System.out.println("Bye!");
} catch (ArithmeticException | NullPointerException e) {
System.out.println("Sorry, can't do that!"+e.getMessage());
} finally {
System.out.println("Bye!");
}
}
2) throw
: 상황에 따라 직접 예외를 발생시키고 싶을 수 있다.
만약 의도하지 않은 상황에 대해서 직접 예외를 발생시키고 싶다면 throw ~ Exception 으로 새로운 예외 객체 생성.
+ 생성자에 메시지도 넣을 수 있음.
public static double divide(int a, int b) {
if (b==0) throw new ArithmeticException("Division by Zero");
return (double) a/b;
}
3) Throwable & throws
- 예외의 가장 조상은 Throwable
- Error : JVM 단위에서 발생하는 개발자가 처리 불가한 에러. 더이상 실행이 불가능할 정도의 심각한 상황에 대한 예외.
- Exception : 기대하지 않은 상황에 대한 예외 > 처리가 필요함.
* RuntimeException : 일반적인 프로그래밍 오류로 인해 코드 실행중 발생하는 예외. 코드 작성을 꼼꼼히 한다면 방지가 가능하다.
(unchecked exception 컴파일러가 직접 잡아주지 않음)
- NullPointerException : 잘못된 null 사용 (null의 메서드 호출 등)
- ArrayIndexOutOfBoundsException : 어떤 배열의 범위를 벗어나는 index 사용
- ArithmeticException : 0으로 나누는 등 수학적 오류가 있는 계산을 시도할 때 발
* Checked Exception : RuntimeException을 상속받지 않는 모든 예외. 프로그래밍 오류로 발생하는 예외가 아님.
(컴파일 단계에서 예외 발생을 인지하고 개발자에게 예외 사전처리를 강제함)
- FileNotFoundException: 파일을 사용하려 하는데 파일이 존재하지 않을 때 발생
- SQLException : 데이터베이스 사용 중 문제가 발생.
=> 사전에 예외처리를 하거나, 호출하는 측에서 알아서 처리하도록 throws 활용.
// 사전처리 try-catch 활용
public static void readFileContents(String filename) {
File file = new File(filename);
try {
Scanner scanner = new Scanner(file);
} catch (FileNotFoundException e) {
System.out.println("File Not Found!");
}
}
// throws 활용
public static void readFileContents(String filename)
throws FileNotFoundException, AccessDeniedException {
File file = new File(filename);
Scanner scanner = new Scanner(file);
}
'Programming > Java' 카테고리의 다른 글
Stream API (1) | 2023.11.30 |
---|---|
제너릭 (Generics) (1) | 2023.11.29 |
객체지향 프로그래밍 (1) | 2023.11.28 |
클래스 (Class) (1) | 2023.11.28 |
메서드 (Methods) (1) | 2023.11.23 |