목차
- 예외처리 방법
1-1. finally
1-2. try-with-resource - Exception과 오버라이딩
예외처리를 가장 많이 활용하는 것이 io(input/output) 패키지이다.
아직 io를 학습하기 전이므로, io 문법보다는 try-catch 블럭의 실제 사용과 흐름에 집중해서 살펴보자.
1. 예외처리 방법
1-1. finally
- 예외처리 구문과 상관 없이 반드시 수행해야 하는 경우 작성하며, 보통 사용한 자원을 반납할 목적으로 쓰인다.
close()
- 입출력에 사용한 스트림을 닫아주는 메소드이다.
- IOException을 위임한 메소드이기 때문에 finally 블럭 안이더라도 예외처리용 try-catch 블럭을 중첩해 썼다.
- if문에 넣지 않고 그냥 in.close();를 실행한다면, NullPointerException이 발생한다. 파일을 찾지 못해 객체 또한 생성하지 않았으며, 레퍼런스변수 in은 여전히 null을 참조하는 상태라서 발생하는 예외이다.
- NullPointerException은 Unchecked Exception이다. 따라서 이런 경우는 코드 개선이 답이라 할 수있다. 보통 if-else 구문으로 해결 가능하다.
- BufferedReader.class는 throws IOException 상속하고 있다. 때문에 close() 구문에 대해서도 catch 블럭이 중첩 생성되었음을 알 수 있다.
- finally 블럭에서 사용하려면 레퍼런스변수를 try 블럭 밖에서 선언 및 null 초기화해야 한다.
- FileReader 클래스는 생성자에 throws FileNotFoundException 선언해 놓았다. 때문에 이를 사용하기 위해서는 반드시 예외처리가 치러져야 하는 상황이다. 이때는 try-catch 블럭 안에서 생성자 호출해 인스턴스를 만들 수 있다.
- readLine() 메소드 역시 throws IOException이므로 catch 블럭을 추가해서 예외처리 구문을 작성해야 한다.
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("test.dat"));
String s;
while((s = in.readLine()) != null) {
System.out.println(s);
}
} catch (FileNotFoundException | EOFException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 한편 두 익셉션은 extends IOException 상속하고 있다. 결국 FileNotFoundException과 EOFException은 같은 레벨의 자손이기에, 이를 하나의 catch 블럭에서 | 와 함께 동시에 처리할 수 있는 것이다.
- catch 블럭을 여러 개를 작성할 때 후손 타입이 상단에, 조상 타입이 하단에 와야 한다. 그렇지 않으면 모든 익셉션이 조상 타입의 익셉션으로 분류돼 그 밑으로 작성된 catch 블럭은 쓸모 없어지기 때문이다.
1-2. try-with-resource try(인스턴스)
try(BufferedReader in = new BufferedReader(new FileReader("test.dat"))) {
String s;
while((s = in.readLine()) != null) {
System.out.println(s);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 별도의 finally 구문에서 인스턴스를 close() 시키던 방법을 대신할 수 있게끔 개선된 문법으로, JDK 1.7버전에서 추가되었다.
- 인스턴스를 try 옆 소괄호 () 안에서 생성한다. 이 경우에는 try-catch 블럭이 완료될 때 자동으로 close() 처리된다.
2. Exception과 오버라이딩
- 오버라이딩 시 throws 되는 Exception의 개수는 상관 없다. 하지만 범위의 경우 조상이 가진 것과 반드시 같거나 후손이어야 한다.
- 그렇지 못할 경우 문법상 오류에 해당한다.
Exception
△
| 상속
IOException
△
| 상속
EOFException | FileNotFouldException
- Exception도 expends Throwable 하듯이 예외처리 클래스마다 상속 관계가 존재한다.
public class Parent {
public void method() throws IOException {}
}
- 부모클래스가 throws IOException 한다고 가정하자.
public class ChildA extends Parent {public void method() throws Exception {}오류
}
- 이때 ChildA가 부모클래스의 예외처리 클래스보다 상위인 익셉션을 범위로 삼으려 한다면 이는 문법상 오류이다.
public class ChildB extends Parent {
public void method() throws EOFException {} IOException 후손이므로 가능!
}
public class ChildC extends Parent {
public void method() throws IOException {} IOException 동일하므로 가능!
}
- 반드시 부모클래스와 같거나 그보다 후손인 익셉션만을 적용할 수 있다.
'Java' 카테고리의 다른 글
[자바의 정석] Ch 7. 객체 지향 프로그래밍 II 강의 메모 (0) | 2022.01.13 |
---|---|
[JAVA] 14-1. 입출력 | 스트림 | InputStream-OutputStream | Reader-Writer (0) | 2022.01.12 |
[JAVA/수업 과제 practice] ArrayList 데이터 관리 프로그램 만들기 (0) | 2022.01.12 |
[JAVA] 13-1. 예외처리 | throws | try-catch | 사용자 정의 예외클래스 (0) | 2022.01.11 |
[JAVA] 12-2. 컬렉션 | Map | HashMap | Properties (0) | 2022.01.11 |