[ 예외처리 ]
- 예외(Exception)가 발생했을 때 어떻게 할 것인지에 대해 명시해 주는 것
- 예외처리 방법에는 2가지가 있다. 하나는 try - catch 를 사용하여 예외상황을 직접 처리하는 것과, throws 를 사용하여 예외처리 책임을 호출한 쪽으로 전가하는 것
[ try - catch - finally ]
public static void main(String[] args) {
Human man = null
try {
man.getAge(); // NullPointerException
} catch(NullPointerException e) {
/*
예외가 발생했을 때 그 예외가 NullPointerException 이라면
어떻게 할 것인지 명시 한다.
*/
System.out.println("예외 발생");
} finally {
/*
finally 는 예외 발생 여부와 관계없이 수행된다.
즉, 실행을 보장한다. finally 는 사용해도 되고 안해도 된다.
*/
System.out.println("Bye Bye");
}
}
catch 를 여러 개 선언하여 사용할 수 있으나 상위 객체가 먼저 오면 컴파일 에러가 발생한다
다라서 반드시 하위 예외부터 사용해야 한다.
public static void main(String[] args) {
try {
} catch(RuntimeException e) {
} catch(ArrayIndexOutOfBoundsException e) {
}
}
JDK 1.7 이후에서 추가된 것
public static void makeException(int[] arr) {
try {
System.out.println(arr[10]);
//JDK 1.7 이후부터
//여러 예외들에 대해 동일한 작업을 수행하는 경우 아래와 같이 사용 가능
} catch(NullPointerException | ArrayIndexOutOfBoundsException e) {
System.out.println("예외 발생 : " + e.toString());
}
}
[ throws ]
현재 단계에서 예외처리를 정의 내릴 수 없는 경우
import java.io.*;
class ExceptionEx1 {
public static void first() throws FileNotFoundException {
second();
}
//FileNotFoundException 에 대해서 throws 를 사용하여 책임을 전가함.
public static void second() throws FileNotFoundException {
FileReader fr = new FileReader("a.txt");
}
/*
//문법적으로 문제는 없으나 이런 코드는 없음
public static void main(String[] args) throws FileNotFoundException {
first();
}
*/
public static void main(String[] args) {
//따라서 여기서 직접 예외처리
try {
first();
} catch(FileNotFoundException e) {
System.out.println("예외를 처리 하시오");
}
}
}
throws 를 쓰는 방법
class MyLib {
public static void todo() {
try {
//예외발생
new FileReader("a. txt");
} catch(FileNotFoundException e) {
//여기서 예외를 처리하면 Foo, Bar 는 예외에 대해서
//알 방법이 없음... (동작 했는지 안 했는지에 대한 여부)
/*
throws 를 사용하면 Foo 나 Bar 에서 예외처리를 할 수 있고
각 클래스마다 다르게 할 수 있음
*/
}
}
}
class Foo {
public void call() {
MyLib.todo();
}
}
class Bar {
public void call() {
MyLib.todo();
}
}
if 문에서 break; 를 사용하지 않고 예외처리를 이용하는 방법..
public static void main(String[] args) {
try {
int num = 0;
while(true) {
num++;
if(num == 100) {
//예외 객체를 선언하고
//throw 를 사용하면 예외를 직접 발생시키는게 됨
throw new Exception();
}
}
} catch(Exception e) {
System.out.println("end");
}
}
직접 예외 클래스를 생성하여 처리하는 방법
class TooLongArraySizeException extends Exception {
public TooLongArraySizeException() {
super("3개를 초과할 수 없습니다.");
}
public TooLongArraySizeException(int num) {
super(num + " 개를 초과할 수 없습니다.");
}
}
class ExceptionEx3 {
public static void printSum(int... nums) throws TooLongArraySizeException {
// 나는 원소가 3개를 초과하는 걸 원하지 않음
// 3개가 넘어가면 예외로 보겠다.
if(nums.length > 3) {
//예외가 발생하는 상황
//1. 예외객체 정의
TooLongArraySizeException e = new TooLongArraySizeException();
//2. 직접 발생
throw e;
} else {
int sum = 0;
for(int n : nums) {
sum += n;
}
System.out.println(sum);
}
}
public static void main(String[] args) {
try {
printSum(1,2,3);
} catch(TooLongArraySizeException e) {
System.out.println(e.getMessage());
}
try {
printSum(1,2,3,4);
} catch(TooLongArraySizeException e) {
System.out.println(e.getMessage());
}
}
}
'자바프로그래밍' 카테고리의 다른 글
파일입출력(Data : InputStream, OutputStream) (0) | 2020.06.01 |
---|---|
파일 입출력(IO패키지) (0) | 2020.05.28 |
[JAVA] 로또 프로그램(컬렉션 사용) (0) | 2020.04.26 |
List (0) | 2020.04.23 |
컬렉션 (0) | 2020.04.23 |