예외 ( Exception )
예외에는 컴파일러 체크 예외와 실행 예외(Runtime Exception)가 있다.
- 컴파일러 체크 예외는 자바 소스를 컴파일하는 과정에서 예외 처리 코드를 검사하여 예외처리코드가 없다면
컴파일 오류가 발생한다. - 실행 예외는 컴파일하는 과정에서 예외처리 코드를 검사하지 않는 예외를 말한다.
예외 처리
▶ 에러에 대한 처리를 의미
▶ 자바는 예외처리 메커니즘을 제공
▶ 문제 발생 부분을 예상하여 사전에 경고하도록 코드를 작성하는 것을 예외처리라 한다.
대표적인 실행 예외의 종류
- NullPointerException
객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연산자인 dot(.) 를 사용했을 때 발생 - ArrayIndexOutOfBoundsException
배열에서 인덱스 범위를 초과하여 사용할 경우 발생 - NumberFormatException
문자열로 되어있는 데이터를 숫자로 변경하는 경우에 발생 - ClassCastException
형 변환은 부모클래스와 자식클래스간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다.
이러한 관계가 아니라면 다른 클래스로 타입을 변환할 수 없다.
▶ ▶ ▶ 다만, 예외의 종류는 종류가 워낙많아 굳이 외우려고 할 필요는 없다.
public class RuntimeEx {
public static void main(String[] args) {
//Nullpointer
String str = null;
str.charAt(0);
//ArrayIndexOut
int[] arr = {1,2,3 };
arr[4] = 100;
//ClassCast
//String str = (String)new Object();
//NumberFormat
int result = Integer.parseInt("hello world");
}
}
예외 처리 방법 ( try ~ catch ~ finally )
- try
▶ 예외 발생 가능성이 있는 코드를 작성
▶ try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록은 실행되지 않는다. - catch
▶ try 내부에서 예외가 발생하면 즉시 실행을 멈추고, catch 블록으로 이동하여 예외처리코드 실행 - finally
▶ 예외 발생 여부와 상관없이 항상 실행할 내용이 있다면 사용
public class TrycatchEx01 {
public static void main(String[] args) {
int x = 10;
int y = 0;
try {
System.out.println(x + y);
System.out.println(x / y);
System.out.println(x * y);
} catch (Exception e) {
System.out.println("0으로 나누지 마세요!");
}
}
}
public class TrycatchEx02 {
public static void main(String[] args) {
String[] arr = {"홍길동", "이순신", "피카츄"};
int i = 0;
while(i < 4) {
try {
System.out.println(arr[i]);
} catch (Exception e) {
System.out.println("배열 범위를 벗어났습니다");
} finally {
System.out.println("이 문장은 예외 여부와 상관없이 무조건 실행됩니다");
}
i++;
}
System.out.println("프로그램 정상종료");
}
}
다중 catch
- try 블록 내부는 다양한 종류의 예외가 발생할 수 있다.
예외가 여러 가지 발생한다면 다중 catch 블록을 작성하여 예외를 처리한다. - catch 블록은 위에서부터 차례대로 검색되므로, 상위 예외 클래스의 catch 블록이 위에 있다면
하위 예외 클래스의 catch블록은 실행되지 않는다. - catch() 괄호 안에 동일하게 처리하고 싶은 예외를 ' | ' 로 연결하면 된다.
▶ 다만, 이 방식을 사용할 때는 상속관계가 있으면 안된다.
public class MultiTrycatchEx01 {
public static void main(String[] args) {
try {
String a1 = args[0];
String a2 = args[1];
int a = Integer.parseInt(a1); //문자열을 숫자로 변경하는 기능
int b = Integer.parseInt(a2);
System.out.println("두 수의 합:" + (a + b) );
String str = null;
str.charAt(0);
} catch (ArrayIndexOutOfBoundsException e) { //처리할 예외의 종류가 들어갑니다
System.out.println("반드시 매개값을 2개 넣어주세요");
e.printStackTrace();
} catch (NumberFormatException | NullPointerException e ) {
System.out.println("매개값을 숫자로 입력하세요");
} catch (Exception e) {
System.out.println("기타 예외 입니다");
}
}
}
예외처리의 상속 관계
Error 클래스를 상속하는 예외 클래스의 예외 상황은 시스템 오류 수준의 예외 상황으로 프로그램 내에서
처리 할 수 있는 수준의 예외가 아니다, ( 심각한 에러 )
▷ Exception이 모든 예외를 처리할 수 있는 이유는 예외클래스들의 부모클래스 이기 때문이다.
예외처리 방법 1 - 예외 떠넘기기 ( throws )
throws 는 메서드나 생성자를 호출한 곳으로 예외를 떠넘기는 코드이다.
즉, 예외처리를 직접 수행하지 않고 메서드를 호출자에게 예외를 던지는 방법이다.
- throws 키워드가 붙어있는 메서드는 반드시 try 블록 내부에서 호출
- catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.
- main도 throws를 사용할 수 있다.
public class ThrowsEx02 {
public ThrowsEx02() throws Exception {
System.out.println("생성자 호출");
aaa();
System.out.println("생성자 종료");
}
public void aaa() throws Exception {
System.out.println("aaa시작");
bbb();
System.out.println("aaa종료");
}
public void bbb() throws Exception {
System.out.println("bbb시작");
System.out.println(10 / 0); //exception
System.out.println("bbb종료");
}
}
public class MainClass {
public static void main(String[] args) throws Exception {
ThrowsEx02 ex = new ThrowsEx02();
}
}
예외 강제 발생 시키기
사용자가 직접 선언한 예외 클래스나 자바가 제공하는 예외 API에서 예외를 강제 발생시키려면 throw 라는 키워드를 사용
>>> 예외를 강제 발생시키며 메서드를 강제 종료 시킨다.
public class ThrowEx01 {
public static void main(String[] args) {
/*
* throw - 예외 강제로 발생시키기
*
* 메서드나 생성자에서 throw new 예외클래스()
* 를 만나면 예외가 생성됩니다.
*
* throw키워드를 만나면
* try~catch 문장이나 throws키워드로 예외처리를 진행해야 합니다.
*
* throw특정 조건과 함께 catch문장으로 프로그램 실행을 옴길 때 사용가능합니다.
*/
try {
int result = calc(-10);
System.out.println(result);
} catch (Exception e) {
//System.out.println( e.getMessage() ); //예외 발생시 예외객체가 가지고 있는 메시지를 얻는 기능
e.printStackTrace();
//예외 경로를 추적하는 메시지를 출력하는 용도로 많이 사용됩니다.
//예외 원인을 찾을 때, 개발시에 매번 사용됩니다.
}
System.out.println("프로그램 정상종료");
}
public static int calc(int n) throws Exception {
//음수가 넘어오면 메서드 실행할 필요도 없이 강제종료
if(n < 0) {
throw new Exception("값을 양수로 전달하세요");
}
int sum = 0;
for(int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
}
사용자 정의 예외
프로그램 개발하다보면 자바 표준 API에서 제공하는 예외 클래스만으로 다양한 종류의 예외를 표현 할 수 없다.
개발자가 만든 어플리케이션에서 자체적으로 생길 수 있는 예외는 개발자가 직접 예외처리를 해야한다.
- 사용자 정의 예외 클래스는 Exception 클래스를 상속하여 사용하면 된다.
- 사용자 정의 예외 클래스의 이름은 Exception으로 끝나는 것이 좋다.
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] API - java.util Package (0) | 2023.12.05 |
---|---|
[JAVA] API ( java.lang package ) (0) | 2023.12.04 |
[JAVA] 인터페이스 (Interface) (0) | 2023.11.30 |
[JAVA] Final 과 Abstract(추상화) (0) | 2023.11.30 |
[JAVA] SingleTon Design Pattern (0) | 2023.11.30 |