이전 게시글에 이어서 오늘 Java 예외를 마무리해보도록 하자.
Exception
은 Checked Exception
과 Unchecked Exception
으로 나뉜다.
Checked Exception은
컴파일러가 예외가 발생할 것을 예상하고 컴파일이 되지 않는 것이고,
Unchecked는 그 반대일 것이다.
Unchecked Exception
은 RuntimeException 포함 그 자식
들이고,
Checked Exception
은 RuntimeException 포함 자식 제외로 예외로 IOException
이다.
import java.io.FileWriter;
public class CheckedExceptionApp {
public static void main(String[] args) {
FileWriter f=new FileWriter("data.txt");
f.write("Hello");
f.close();
}
}
해당 소스코드를 작성 시,
빨간 밑줄이 생기는데, 마우스 커서를 가져다놓을시,
IOException에 대한 예외 처리를 하지 않았다고 뜬다.
import java.io.FileWriter;
import java.io.IOException;
public class CheckedExceptionApp {
public static void main(String[] args) {
try {
FileWriter f=new FileWriter("data.txt");
f.write("Hello");
f.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
try-catch 문
으로 감싸주면 이제 컴파일이 가능해진다.
실행시키면, 자바 프로젝트 파일 안에 data.txt가 생성된 것을 확인할 수 있다!
자바가 프로그램 외부의 데이터에 접근하려고 할 때 생기는 문제가 있다.
외부 데이터는 파일 또는 네트워크, DB 등이 있는데, 이러한 것들을 Resource
라고 한다.
이런 Resource들은 작업 중에 붙잡고 있다가 끝나면 해제해줘야한다.
위에서 작성한 코드 중 f.close()에 대해 살펴보자.
만약, f.close()위의 try안 문장에서 예외가 발생할 수 있다.
그러면 바로 catch로 들어가버리므로 close()명령 실행 기회를 잃어버리게 된다.
그러므로 이 f.close()를 finally 구문
안으로 옮기자!!
finally 구문은 예외가 발생하건 말건 무조건 실행
된다!
그런데 finally 안으로 옮긴 f.close()에 빨간줄이 뜨고 이것은 초기화가
안됐기 때문인데,
만약 f가 셋팅이 되어있지 않으면 . 즉, f가 셋팅 되어있을 때만 f.close()를
실행하도록 해보자.
또 빨간 밑줄이다!!
import java.io.FileWriter;
import java.io.IOException;
public class CheckedExceptionApp {
public static void main(String[] args) {
FileWriter f=null;
try {
f=new FileWriter("data.txt");
f.write("Hello");
}catch(IOException e) {
e.printStackTrace();
}finally {
if(f!=null) {
try {
f.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
요렇게 수정해주면 해결이 된다~
하지만 너무 더러운데..
close가 필요한 resource 작업 할 때 코드가 너덜너덜해지는 것을 막기 위한 것이 등장했다.
클래스가 AutoCloseable
이라는 인터페이스를 가지고 있다면,
try-with-resource
라는 문법을 사용할 수 있다.
이전에 사용하던 try와 다르게
try(){}를 쓰고, () 안에 close 시켜야 하는 문장
을 넣는다.
우리가 작성한 소스코드에서는
FileWriter f=new FileWriter("data.txt")
이 문장이다. (세미콜론 제외)
import java.io.FileWriter;
import java.io.IOException;
public class TryWithResource {
public static void main(String[] args) {
try (FileWriter f=new FileWriter("data.txt")){
f.write("Hello");
}catch(IOException e) {
e.printStackTrace();
}
}
}
이 코드는 결국 이전에 작성했던 수많은
try-catch-finally, try-catch 문과 같아
지게 된다!
처음 배운다!
그리고 f.close(); 는 필요가 없어
진다! 자동으로 해주니까!
훨씬 보기가 좋다!
내가 스스로 예외
를 발생시킬 수도 있다.
throw
public class MyException {
public static void main(String[] args) {
// TODO Auto-generated method stub
throw new RuntimeException("Something Wrong");
}
}
실행시키면 이렇게 예외
가 발생한다!
throws
import java.io.FileWriter;
import java.io.IOException;
public class ThrowException {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
FileWriter f=new FileWriter("./data.txt");
}
}
파일을 수정하는 코드를 짜기 위해 작성했다.
throws IOException
을 저렇게 작성하면,
이제 저 코드를 사용하는 쪽에서 예외를 처리해야한다.
다음은 자바의 메소드
에 대해 공부할 것이다~