= 예외(Exception) (2)
= 예외의 처리 코드 =
예외 처리 코드란?
프로그램에서 예외가 발생 시, 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유도할 수 있도록 처리하는 코드
자바 컴파일러가, 소스 파일 컴파일 할 때 일반 예외 가능성 있는 코드 발견하면, 컴파일 오류를 발생시켜서 예외 처리 코드를 작성하도록 유도한다.
but, 실행 예외는 컴파일러가 체크해주지 않는다는 점.
예외처리의 대표 방법 try - catch -finally 블록방법!
try블록에 예외 발생 카드 코드가 위치한다.
try코드가 예외 발생 없이 정상 실행되면 바로 finally (catch 블록 생략)
try코드에 예외 발생이 있다면, catch 블록 다음 finally블록 순서로 실행된다.
finally코드는 생략이 가능하다는 점~(예외 여부에 상관없이 쓰고싶은 문구가 있을 때 사용한다고 생각하면 편하다)
try {
예외 발생 코드
}catch(예외클래스 e){
예외 처리
} (finally는 선택){
예외이든 아니든 항상 실행되는 코드
}
public static void main(String[] args) {
System.out.println("프로그램 시작");
try {String[] arr = {"java", "python", "c"};
System.out.println(arr[2]);
System.out.println("트라이 블럭 종료");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("익셉션 발생");
System.out.println("익셉션 블럭 종료");
} finally {
System.out.println("꼭 실행되어야 하는 코드");
}
System.out.println("프로그램 종료");
}
}
< 출력값 >
프로그램 시작
c
트라이 블럭 종료
꼭 실행되어야 하는 코드
프로그램 종료
= 다중 catch =
try블록 내부에서, 예외가 여러가지 발생할 때, 발생하는 예외마다 처리 코드를 다르게 하려고 할 때 사용하는 catch 방법이다.
catch의 특이점은, catch블록이 여러개가 있어도, 해당하는 예외에 맞춰서 오직 1개의 catch만 실행됩니다.
why? 위에서부터 아래로 실행하다가 예외가 발생되는 부분에서 바로 catch로 이동되기 때문이다.
그래서 중요한 점이, 바로 catch의 순서이다.
하위 예외 클래스가 상위 예외 클래스의 위치 해야한다.
why? 상위 예외 클래스가 하위 예외 클래스보다 위에 있으면, 상위 예외 클래스의 예외로 실행되면서,
하위 예외 클래스의 catch는 실행되지 않기 때문에, 코드의 존재 자체가 의미가 사라지기 떄문이다.
< 다중 catch 예제 >
try에서 arr[3]을 arr[2]로 바꾸면 넘버포맷익셉션이 발생한다.
public class Example1 {
public static void main(String[] args) {
System.out.println("프로그램 시작");
String[] arr = {"3", "4", "a"};
try {
int n = Integer.parseInt(arr[3]);
System.out.println(n);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("어레이인덱스아웃오브바운즈익셉션 발생");
} catch (NumberFormatException e) {
System.out.println("넘버포맷익셉션 발생");
}
System.out.println("프로그램 종료");
}
}
= 멀티 catch =
멀티 catch는 catch괄호 내에 동일하게 처리하고 싶은 예외를 |로 연결하여서 작성하여주면 된다.
아주 간단한 개념! arr[2]가되든, arr[1]이든 같이 익셉션 발생이 출력된다!
public class Example5Multiple {
public static void main(String[] args) {
String[] arr = {"1", "a"};
try {
int i = Integer.parseInt(arr[1]);
} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
System.out.println("익셉션 발생");
}
}
}
= 예외 발생시키기 =
예외를 발생시키는 이유는 잘못된 부분이 있다는 정보를 주기 위함입니다.
만약 자바에 예외란 개념이 없다면, JVM은 예외 난 곳을 알려주지 않고, 그저 순서대로 코드를 진행하고, 프로그램이 종료가 되어버립니다.
간단한 throw 예제 확인하기!
public static void main(String[] args) {
System.out.println("프로그램 시작");
// RuntimeException을 상속 받은 Exception은
// try/catch를 사용해도 되고 안해도 됨
NullPointerException e = new NullPointerException();
throw e;
//System.out.println("프로그램 종료");
}
}
= 예외 떠넘기기=
try - catch 블록 말고도, 예외를 처리하는 방법으로,
메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다.
리턴타입 메소드명(매개변수. …) throws 예외클래스1, 예외클래스2 …{}
exception은 부모예외클래스이기 떄문에, 예외클래스를 묶어서 Exception이라고 표현해도 사용 가능합니다.
throws 키워드가 붙은 메소드는 반드시 try 블록 내에서 호출되어야 하며, catch 블록에서 넘겨 받은 예외를 처리해야합니다.
public static void main(String[] args) {
System.out.println("프로그램 시작");
// RuntimeException을 상속 받은 Exception은
// try/catch를 사용해도 되고 안해도 됨
NullPointerException e = new NullPointerException();
throw e;
//System.out.println("프로그램 종료");
}
}
= 사용자 정의 예외와 예외 발생 =
자바 표준 API에서 제공하지 않는 다양한 종류의 예외를 표현 할 수 있는 방법!
아래에는 수업시간에 진행했던 사용자정의 예외의 예제를 붙이겠습니다.
public class ImageNotFoundException extends RuntimeException {
// 1. RuntimeException (unchecked)
// 2. Exception (checked)
// 보통 "String message 파라미터" 받는 생성자 만듬
public ImageNotFoundException() {
}
public ImageNotFoundException(String message) {
super(message);
}
}
< MainClass >
public class Example1 {
public static void main(String[] args) {
try {
String s = getImage("cat");
System.out.println("찾은 이미지: " + s);
System.out.println("프로그램 종료");
} catch (RuntimeException e) {
e.printStackTrace();
}
}
public static String getImage(String name) {
String[] images = {"dog", "lion"};
for (String image : images) {
if (image.equals(name)) {
return image;
}
}
throw new ImageNotFoundException(name + "를 찾으려고 했음.");
}
}
아직 사용자 정의 예외는 다루는게 익숙하지가 않아서, 충분한 연습이 필요할 것으로 예상된다.
우선 기본적인 예외의 정보들을 파악하는 것 먼저 시작하기!
'수업 복습하기 > Java' 카테고리의 다른 글
Day 15 - 예외(Exception) (0) | 2021.09.10 |
---|---|
Day 15 - 인터페이스(Interface) (0) | 2021.09.08 |
Day 14 - 추상 (abstract) (0) | 2021.09.06 |
Day 13 - Final (변수, 클래스, 메소드) (7) | 2021.09.06 |
Day 13 - 정적 멤버 (Static) (0) | 2021.09.06 |