# try-with-resources 的用法
**Question:**
```java=
final class Folder { //line n1
//line n2
public void open() {
System.out.print("Open");
}
}
public class Test {
public static void main(String[] args) throws Exception {
try (Folder f = new Folder()) {
f.open();
}
}
}
```
## Which two modifications enable the code to print Open Close?
**A. Replace line n1 with:**
```java=
class Folder implements AutoCloseable {
```
B. Replace line n1 with:
```java=
class Folder extends Closeable {
```
C. Replace line n1 with:
```java=
class Folder extends Exception {
```
D. At line n2, insert:
```java=
final void close() {
System.out.print("Close");
}
```
**E. At line n2, insert:**
```java=
public void close() throws IOException {
System.out.print("Close");
}
```
- [x] **Answer:AE**
- [參考網站](https://magiclen.org/ocpjp-try-with-resources-3/)
**要把物件當作try-with-resources的資源,該物件類別必須要實作AutoCloseable介面的close方法。**
---
**改良後程式碼如下:**
```java=
final class Folder implements AutoCloseable {// line n1
@Override
public void close() throws Exception { //line n2
System.out.println("Close");
}
public void open() {
System.out.print("Open");
}
}
public class Test {
public static void main(String[] args) {
try (Folder f = new Folder()) {
f.open();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
```
---
**Question:**
```java=
public static void main(String[] args) throws IOException {
BufferedReader brCopy = null;
try (BufferedReader br = new BufferedReader (new FileReader("employee.txt"))) { //line n1
br.lines().forEach(c -> System.out.println(c));
brCopy = br;//line n2
}catch (Exception e) {
System.out.println(e);
}
brCopy.ready(); //line n3;
}
```
## Assume that the ready method of the BufferedReader, when called on a closed BufferedReader,
throws an exception, and employee.txt is accessible and contains valid text.
What is the result?
A. A compilation error occurs at line n3.
B. A compilation error occurs at line n1.
C. A compilation error occurs at line n2.
**D. The code prints the content of the employee.txt file and throws an exception at line n3.**
- [x] **Answer: D**
- [參考網站](https://magiclen.org/ocpjp-try-with-resources-5/)
:::info
br變數所參考到的BufferedReader物件為try-with-resources結構的資源,因此在離開try-with-resources結構的try區塊後,資源就會被釋放(BufferedReader物件會close)。
line n3的部份在BufferedReader物件被close之後呼叫ready方法,所以會拋出IOException。
:::
###### tags: `ocpjp`