Try는 네트워크와 같습니다. Try {}의 코드에 의해 발생 된 모든 예외를 그대로 얻은 다음 처리를 위해 Catch {}의 코드에 예외를 건네줍니다. 마지막으로 코드를 마침내 실행하십시오. 시도의 코드에 예외가 있는지 여부와 캐치 캐치가 예외를 잡는지 여부에 관계없이 코드는 최종적으로 실행됩니다.
Java 실행 기간 시스템에서 제공하는 사전 설정 프로세서는 디버깅에 유용하지만 일반적으로 예외를 직접 처리하려고합니다. 이를 수행하는 데는 두 가지 장점이 있습니다. 첫째, 오류를 수정할 수 있습니다. 둘째, 프로그램이 자동으로 종료되는 것을 방지 할 수 있습니다. 오류가 발생할 때마다 프로그램이 중지되어 스택 트랙을 인쇄하면 대부분의 사용자가 혼란스러워집니다. 다행히도이 상황을 쉽게 피할 수 있습니다.
실행 기간 오류를 조심하고 처리하려면 모니터링하려는 코드를 시도 블록에 넣으십시오. 시도 블록 직후에 Catch 절에서 잡으려는 예외 유형 오류 캡처 예제를 지정하십시오.
{code; 자신의 코드를 입력하십시오.
예를 들어:
import java.io.*; // IO 패키지 호출 공개 클래스 SimpleCharinout {public static void main (String args []) {char ch = ''; // 문자 ch를 'system.out.prin tln으로 정의합니다. " 문자를 입력하십시오 "); // 캐릭터 입력 화면에 시도하십시오 {// 시도 블록에 모니터링하려는 프로그램 코드를 넣으십시오. 시도 블록 직후, Catch 절에서 캡처하려는 예외 패턴을 지정하십시오 ch = (char) system.in.read (); // 키보드에서 입력 한 문자를 Cath (ioException e)로 할당하십시오. // 위 코드에 오류가 있으면 여기에서 {}를 잡을 수 있습니다. // 오류 System.out.println 이후 작동하지 않음 ( "입력 된 문자 :" + ch); 화면 문자 : // ch}}}
우리가 Java try .. catch를 쓸 때, 우리는 종종 IO 리소스를 닫기 위해 최종적 조항을 추가해야합니다.
inputStream은 {is = openInputStream ()} catch (e.printstacetrace (e); }}
그러나이 패턴을 사용할 때, 자바 참전 용사조차도 때때로 실수를합니다. 예를 들어, 위의 코드에서 OpenInputStream () 함수가 실행 중에 예외를 던지면 execution is.close (nullpoiterexception)는 IoException 클래스의 자식이 아닙니다. 따라서 캐치 블록에 의해 잡힐 수는 없지만, 호출 레이어에 직접 던져지는 것은 스트림을 닫을 때 비어 있지 않은 판단을하는 것입니다. 나는 개인적으로 더 우아한 글쓰기 방법은 Commons-IO 패키지가 제공 한 ioutils.closequely () 메소드를 직접 호출하여 스트림을 닫거나 (또는 CloseQuitely () 메소드를 캡슐화하는 것입니다.
이 글쓰기 방법을 사용하면 또 다른 장점이 있습니다. 즉, 다음 코드와 같은 여러 IO 리소스를 닫을 때 실수를 쉽게하는 것이 쉽지 않습니다.
inputStream은; outputStream os; try {is = OpenInputStream (); if (os! = null) os.close ()} catch (ioexception e) {}}
is.close ()에서 오류가 발생하면 os.close ()를 실행할 수 없으므로 OS에 의해 참조 된 리소스가 해제되지 않습니다.
아마도 Oracle은 또한 이런 종류의 시도 ... 캐치 ... 마침내 보일러 플레이트 코드가 너무 불필요하다고 생각하기 때문에 JDK 7의 Try Clause를 수정하여 리소스를 수동으로 닫는 일부 코드의 작성을 제거하여 코드를 만듭니다. 더 작고 단순 해 보입니다. 예를 들어 위의 코드는 다음으로 변경할 수 있습니다.
try (inputStream은 = OpenInputStream (); outputStream os = OpenoutStream ();) {// do do} catch (ioException e) {e.printScetrace (e);}
Oracle은 여기에서 try-with-resource 문을 여기에서 try (..)라고 부릅니다. try (..)의 변수에 의해 참조 된 객체는 java.io.autoclosable 인터페이스를 구현하는 인스턴스입니다. 즉, Try-With-resource 문의 리소스는 IO 리소스에만 국한되지 않습니다.
여기에서 시도해 보려는 시도의 일부 세부 사항에 대한 추가 설명을 제공해야합니다.
JDK는 Close () 메소드가 예외를 발생하는지 여부에 관계없이 모든 리소스의 Close () 메소드가 호출되도록하고, 호출 순서는 리소스 선언 순서에서 반전됩니다.
Try-With-resource 문에 대한 모든 예외는 잡히게됩니다. 여러 예외가 발생하면 이전 예외에서는 후속 예외가 억제됩니다. 억제 된 예외는 Throwable 클래스에 의해 정의 된 getSuppressed ()를 호출하여 얻을 수 있습니다.
위의 예,
시도를 종료 할 때 JDK는 os.close ()를 먼저 호출합니다. OS.close ()에 의해 발생하는 예외에서, 캐치 블록은 os.close ()에 의해 발생하는 예외 만 잡습니다. getSuppressed () 메소드를 통해 is.close ()가 던진 예외를 얻을 수 있습니다.
OpenInPutStream ()이 호출 될 때 ioException이 발생하면 OpenOutputStream ()가 호출되지 않으며 os.close () 및 is.close ()는 호출되지 않으며 OpenInPutStream () 예외를 호출 할 때 캐치 블록이 발생합니다.
IOException이 발생하면 (토큰 E1에 의해 표시됨) IS.Close ()가 여전히 IoException (Token E2로 표시)을 던지는 경우 E2가 억제됩니다 캐치 블록에 의해 잡힌 예외는 E1입니다.
JDK 7은 시도 블록을 리모델링하는 것 외에도 캐치 부분을 단순화하여 여러 캐치 조항을 병합 할 수 있습니다. 예를 들어:
try (inputStream은 = OpenInputStream (); outputStream os = OpenoutStream ();) {// do do} catch (ioException | xmlParseException | XPathException e) {e.printScetrace (e);}
또한 여러 예외를 리트 윗하면 더 이상 예외 유형을 자세히 정의 할 필요가 없습니다. 메소드가 정의 될 때 발생 해야하는 예외를 선언하면됩니다. 예를 들어
// 여기에서 예외는 IoExcept와 일치하지만, 컴파일러는 실제로 상위 계층에 던져진 예외가 ioExcept 공개 void doio (try {trow new ioException ()}임을 알고 있습니다 ) {Throw E;}}
추신 :이 기능이 가져올 혜택을 생각할 수 없습니다.
JDK 7은 이진 리터럴, 밑줄과 함께 긴 숫자의 분할, 제네릭 매개 변수의 유형 추론, 스위치 지원 문자열 매칭 등과 같은 다른 흥미로운 새로운 구문 기능이 있습니다. 이제 JDK 8은 몇 가지 유용한 기능을 소개했습니다. 뒤로 호환성을 고려하지 않고 적절하고 유연하게 일부 구문 기능을 적용하면 코드가 어느 정도 더 명확하고 간결하게 보일 수 있습니다.