Try - With - Resource
2022. 12. 4. 13:04ㆍ자바멘토링
try with resource는 자바 7버전 부터 사용가능하게 나왔다.
autocloseable 인터페이스를 상속 받는
친구들만 사용이 가능하다.
ex)class FileWriter, BufferedInputStream 등
리소스를 사용할때 close()가 꼭 필요한 작업에서 사용시 유리하다.
Try - Catch -Finally
package main99;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) {//코드가 지저분 하다.
String txt ="테스트 입니다!!";
String fileName = "손흥민.txt";
FileWriter f = null;//null검사
try {
f = new FileWriter(fileName);
f.write(txt);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//만약에 f가 null이 아니라면
if( f !=null) {
try {
f.close(); //따로 close();자원을 반납으로 해줘야 메모리 누수 발생하지 않는다.
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
}
Try-With-Resource
package main99;
import java.io.FileWriter;
public class TryWithResource {
public static void mian(String [] args) {
String txt ="테스트 입니다!!";
String fileName = "손흥민.txt";
try( FileWriter f = new FileWriter(fileName)){//바로 객체 생성, close();안해줘도 자원 반납된다.
f.write(txt);
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
AutoCloseable 구현
- AutoCloseable을 implments 해서 try-with-resource를 활용할 수 있습니다.
- close()를 오버라이딩하여 구현합니다.
package main99;
public class MyResource implements AutoCloseable{
public void doSomething() {//리소스에서 메소드 하나를 제공해 준다.
System.out.println("Do something");
//에러를 던질 수 있다.
throw new FirstError();
}
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
System.out.println("Close My Resource");
throw new SecondError();
}//try -with-resource
}
package main99;
public class FirstError extends RuntimeException {
}
package main99;
public class SecondError extends RuntimeException {
}
Try-Catch-Finally 로 구현시
package main99;
public class AppRunner {
public static void main(String[] args) throws Exception {
MyResource myResource = new MyResource();
try {
myResource.doSomething();
}finally {
myResource.close();
}
}
}
결과: 처음 발생한 에러 부분 내용이 없다. 에러 시작 시점을 알 수 없다.
Do something
Close My Resource
Exception in thread "main" main99.SecondError
at main99.MyResource.close(MyResource.java:16)
at main99.AppRunner.main(AppRunner.java:10)
Try-With-Resource 로 구현시
package main99;
public class AppRunner2 {//try - with- resource 로 하면 따로 close()하지 않아도된다.
public static void main(String[] args) throws Exception {
try(MyResource myResource = new MyResource()){
myResource.doSomething();
/* myResource.close(); */
}
}
}
결과: 처음 에러가 발생한 지점을 알 수 있다.
Do something
Close My Resource
Exception in thread "main" main99.FirstError
at main99.MyResource.doSomething(MyResource.java:8)
at main99.AppRunner2.main(AppRunner2.java:7)
Suppressed: main99.SecondError
at main99.MyResource.close(MyResource.java:16)
at main99.AppRunner2.main(AppRunner2.java:10)
'자바멘토링' 카테고리의 다른 글
파일디스크립터 (0) | 2022.12.18 |
---|---|
리플렉션 (0) | 2022.12.15 |
추상클래스 (0) | 2022.12.03 |
Weak Reference & Soft reference (0) | 2022.12.03 |
Static 이란? (0) | 2022.11.27 |