java
이 자습서에서는 리소스를 자동으로 닫는 try-with-resources 문에 대해 알아봅니다.
try-with-resources
명령문은 명령문의 끝에서 모든 자원을 자동으로 닫습니다. 리소스는 프로그램이 끝날 때 닫을 개체입니다.
구문은 다음과 같습니다.
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
위 구문에서 볼 수 있듯이 try-with-resources
를 선언합니다. 성명,
try
내에서 리소스 선언 및 인스턴스화 조항.참고: try-with-resources 문은 AutoCloseable 인터페이스를 구현하는 모든 리소스를 닫습니다.
<시간>
try-with-resources
를 구현하는 예를 들어보겠습니다. 성명서.
import java.io.*;
class Main {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
test.txt 파일을 찾을 수 없는 경우 출력합니다.
IOException in try-with-resources block =>test.txt (No such file or directory)
test.txt 파일을 찾으면 출력합니다.
Entering try-with-resources block Line =>test line
이 예에서는 BufferedReader의 인스턴스를 사용합니다. test.txt
에서 데이터 읽기 파일.
BufferedReader 선언 및 인스턴스화 try-with-resources
내부 문은 try
여부에 관계없이 해당 인스턴스가 닫히도록 합니다. 문이 정상적으로 완료되거나 예외가 발생합니다.
예외가 발생하면 예외 처리 블록이나 throw 키워드를 사용하여 처리할 수 있습니다.
<시간>
위의 예에서 try-with-resources
에서 예외가 발생할 수 있습니다. 다음의 경우:
test.txt
찾을 수 없습니다.BufferedReader
닫기 개체.
try
에서도 예외가 발생할 수 있습니다. 파일 읽기로 차단은 언제든지 여러 가지 이유로 실패할 수 있습니다.
try
에서 예외가 발생하는 경우 블록 및 try-with-resources
명령문 try
의 예외 블록이 발생하고 try-with-resources
에서 예외가 발생합니다. 문이 표시되지 않습니다.
Java 7 이상에서는 Throwable.getSuppressed()
을 호출하여 억제된 예외를 검색할 수 있습니다. try
에서 throw된 예외의 메서드 차단합니다.
이 메서드는 억제된 모든 예외의 배열을 반환합니다. catch
에서 억제된 예외를 얻습니다. 차단합니다.
catch(IOException e) {
System.out.println("Thrown exception=>" + e.getMessage());
Throwable[] suppressedExceptions = e.getSuppressed();
for (int i=0; i<suppressedExceptions.length; i++) {
System.out.println("Suppressed exception=>" + suppressedExceptions[i]);
}
}
<시간>
try-with-resources 사용의 장점은 다음과 같습니다.
Java 7이 이 기능을 도입하기 전에 finally
을 사용해야 했습니다. 리소스 누출을 방지하기 위해 리소스가 닫혀 있는지 확인하기 위해 차단합니다.
다음은 예제 1과 유사한 프로그램입니다. . 그러나 이 프로그램에서는 finally 블록을 사용하여 리소스를 닫습니다.
import java.io.*;
class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("test.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block =>"+e.getMessage());
}
}
}
}
출력
Entering try block Line =>line from test.txt file Entering finally block
위의 예에서 볼 수 있듯이 finally
리소스를 정리하는 블록은 코드를 더 복잡하게 만듭니다.
try...catch
주목 finally
에서 차단 블록도? 이는 IOException
BufferedReader
을 닫는 동안에도 발생할 수 있습니다. 이 finally
내부의 인스턴스 차단하여 또한 포착 및 처리됩니다.
try-with-resources
문은 자동 리소스 관리를 수행합니다. . JVM이 자동으로 리소스를 닫기 때문에 명시적으로 리소스를 닫을 필요가 없습니다. 이렇게 하면 코드를 더 읽기 쉽고 쓰기 쉽게 만들 수 있습니다.
try-with-resources
에서 둘 이상의 리소스를 선언할 수 있습니다. 문을 세미콜론 ;
으로 구분하여
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
}
}
이 프로그램이 예외를 생성하지 않고 실행되면 Scanner
개체는 testRead.txt
에서 한 줄을 읽습니다. 파일을 만들고 새 testWrite.txt
에 씁니다. 파일.
여러 선언이 이루어지면 try-with-resources
문은 이러한 리소스를 역순으로 닫습니다. 이 예에서 PrintWriter
객체가 먼저 닫힌 다음 Scanner
개체가 닫혔습니다.
Java 7에는 try-with-resources
에 대한 제한이 있습니다. 성명. 리소스는 해당 블록 내에서 로컬로 선언되어야 합니다.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) {
// code
}
Java 7에서 블록 외부에 리소스를 선언했다면 오류 메시지가 생성되었을 것입니다.
Scanner scanner = new Scanner(new File("testRead.txt"));
try (scanner) {
// code
}
이 오류를 처리하기 위해 Java 9는 try-with-resources
을 개선했습니다. 리소스의 참조가 로컬로 선언되지 않은 경우에도 사용할 수 있도록 명령문. 위의 코드는 이제 컴파일 오류 없이 실행됩니다.
java
자바 ArrayDeque 이 자습서에서는 예제를 통해 ArrayDeque 클래스와 해당 메서드에 대해 알아봅니다. 또한 배열 deque를 사용하여 스택을 구현하는 방법을 배웁니다. 자바에서는 ArrayDeque를 사용할 수 있습니다. 배열을 사용하여 queue 및 deque 데이터 구조를 구현하는 클래스입니다. ArrayDeque에 의해 구현된 인터페이스 ArrayDeque 클래스는 다음 두 인터페이스를 구현합니다. 자바 대기열 인터페이스 자바 데크 인터페이스 ArrayDeque 생성 배열 데크를 생성하려면 jav
자바 ArrayBlockingQueue 이 자습서에서는 예제를 통해 ArrayBlockingQueue 클래스와 해당 메서드에 대해 알아봅니다. ArrayBlockingQueue Java Collections 프레임워크의 클래스는 배열을 사용하여 차단 대기열 구현을 제공합니다. Java BlockingQueue 인터페이스를 구현합니다. ArrayBlockingQueue 생성 배열 차단 대기열을 생성하려면 java.util.concurrent.ArrayBlockingQueue를 가져와야 합니다. 패키지. 패키지를 가져온