예외 처리를 하는 근본적인 이유 : 프로그램이 오작동하거나 비정상 종료를 막기 위해
1. 종류
1) 컴파일 에러(compile-time error) : 구문 체크, 번역, 최적화, 생략된 코드 추가 등을 컴파일러가 한다.
2) 런타임 에러(runtime error) : 프로그램 실행 중 발생하는 에러 (프로그램 종료)
- 에러(Error) : 프로그램 코드에 의해 수습될 수 없는 심각한 오류
ex) 메모리 부족, Out of Memory error 혹은 스택오버플로우 StackOverFlowError)
- 예외(Exception) : 프로그램 코드에 의해 수습될 수 있는 다소 미약한 오류 --> 예외처리로 프로그램의 비정상적 종료 막을 수 있다.
3) 논리적 에러(logical error) : 작성 의도와 다르게 동작하는 경우
* Exception과 Error모두 조상은 Object 클래스이다.
2. 예외 처리
1) 정의 : 예외의 발생에 대비한 코드를 작성하는 것
2) 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
*모든 예외 클래스의 조상 Exception
3. try-catch문
class Main{
public static void main(String []args){
int number =100;
int result =0;
for(int i=0; i<10; i++){
try{
result = number /(int)(Math.random() *10);
System.out.println(result);
} catch(ArithmeticException e){
System.out.println("0");
}//try-catch끝
}//for의 끝
}
}
//0으로 나눌 경우 프로그램 종료되지 않고 0찍고 계속 나머지 수행함
//멀티 catch블럭
try{
....
} catch(Exception A| Exception e){
e.printStackTrace();
}
1) 예외 흐름
Try 블럭블록 내에서 예외가 발생한 경우 그에 해당하는 catch 블록 찾고 catch블록을 수행한 후 그다음 문장을 계속해서 수행한다.
4. printStackTrace()와 getMessage()
이 두가지는 catch 블록 내에서만 사용 가능하다.
- printStackTrace = 예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage() = 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
5. 예외 발생시키기
class ExceptionExample {
public static void main(String[] args) {
try {
Exception e = new Exception("고의 예외 발생");
throw e;
// throw new Exception("고의 예외 발생"); 위의 두 줄을 이 줄로 대체가능
} catch(Exception e) {
e.printStackTrace();
e.getMessage();
//
}
}
}
throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며 방법은 아래와 같다.
1) 먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.
Exception e = new Exception("고의로 예외 발생");
2) 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
한 줄로 줄이면 다음과 같이 사용한다.
throw new Exception("고의로 예외 발생");
6. checked예외, unchecked예외
1) checked Exception : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수=try-catch 필수) - exception과 그 자손
ex) FileNotFoundException, ClassNotFoundException, DataFormatException
'그 외의 Exception 클래스들' 이 발생할 가능성이 있는 문장들에 대해 예외처리를 해주지 않으면 컴파일 조차 되지 않는다. -> checked 예외
2) unchecked Exception : 컴파일러가 예외 처리 여부를 체크 안 함(예외 처리 선택=try-catch선택)- runtimeException과 그 자손
ex) IndexOutOfBoundsException, NullPointerException, ClassCastException, ArithmeticException
반면, RuntimeException 클래스들과 그 자손 클래스에 해당하는 예외는 프로그래머가 실수로 발생하는 것들이기 때문에 예외처리를 강제하지 않는다. 따라서 성공적으로 컴파일 된다.
RuntimeException클래스들에 속하는 예외가 발생할 가능성이 있는 코드에도 예외처리를 모두 해줘야 한다면 아래와 같이 참조변수, 배열이 사용되는 모든 곳에 예외 처리를 해주어야 한다.
try{
int arr = new int[10];
System.out.println(arr[0]);
}catch(IndexOutOfBoundException ie){
...
} catch(NullPointerException ne){
...
}
https://devlog-wjdrbs96.tistory.com/351
-> checked, unchecked exception에 따른 rollback내용은 잘못 된 것이다.
7. 메서드에 예외 선언하기 (던지고, 호출하는 곳에서 try-catch)
try-catch외에 메서드에 예외 선언할 수 있다. 메서드 내에서 발생할 수 있는 예외를 적어주면 된다. 예외가 여러 개면 여러 개 적는다. 이렇게 메서드의 선언부에 명시하고, 이 메서드를 사용하는 쪽에서 예외처리를 하면 된다.
void method() throws Exception1, Exception2, ... ExceptionN{
....
}
아래와 같이 모든 예외의 최고조상인 Exception 클래스를 메서드에 선언하면 이 메서드는 모든 종류의 예외가 발생할 가능성이 있다는 것을 의미한다.
void method() thorws Exception {
//메서드의 내용
}
자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것
class Main{
public static void main(String[]args){
try{
method1();
}catch(Exception e){
System.out.println("Main 메서드에서 예외가 처리되었습니다.");
e.printStackTrace();
}
} //main메서드의 끝
static void method1() throws Exception{
throw new Exception();
}
}
8. finally블럭
try-catch와 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용
9. 예외 되던지기, 연결된 예외 +a
'Back-end > Java Language' 카테고리의 다른 글
Java Optional, Stream (0) | 2023.01.29 |
---|---|
@JsonIgonore, @JsonProperty, @JsonNaming & Jackson Object Mapper (0) | 2023.01.07 |
super()와 super (0) | 2022.12.11 |
직렬화(Serialization) (0) | 2022.10.12 |
for 문 자세히 알기 (0) | 2022.03.20 |