Java 예외 처리 try...catch...문장의 사용 진급

5073 단어 Java이상 처리
try는 하나의 네트워크와 같아서try {} 안의 코드가 던진 이상을 모두 네트워크에 연결한 다음catch {} 안의 코드에 이상을 맡겨 처리합니다.마지막으로finally의 코드를 실행합니다.try의 코드에 이상이 있든,catch가 이상을 포착하든,finally의 코드는 반드시 실행됩니다.
자바 실행 시기에 시스템이 제공하는 사전 설정 프로세서는 오류 제거에 매우 유용하지만, 당신은 보통 예외를 스스로 처리하려고 합니다.이렇게 하면 두 가지 장점이 있다. 첫째, 그것은 너로 하여금 잘못을 수정하게 한다.둘째, 프로그램의 자동 종료를 피할 수 있다.오류가 발생할 때마다 프로그램이 멈추고 겹쳐진 추적이 인쇄되면 대부분의 사용자들은 곤혹스러워한다.다행히도 너는 이런 상황을 쉽게 피할 수 있다.
실행 시기의 오류를 예방하고 처리하려면try 블록에 감시할 프로그램 코드를 넣으면 됩니다.try 블록에 이어catch 자구에 당신이 포착하고 싶은 예외 형태를 지정합니다
오류 스냅 예:

try 
{ 
  code; // ; 
} catch(e) // ,  
{ 
  alert(e.number); //  
} 
 
예:

import java.io.*;// io 
 public class SimpleCharInOut
 {
 public static void main(String args[])
  {
   char ch=' ';// ch ‘ '
   System.out.println(" Enter a character please");// Enter a character please
   try {//  try  。  try   catch   
 
     ch=(char)System.in.read();// ch
    }
   catch(IOException e) // , 
    {  } ;// 
 System.out.println("You're entered character:" + ch);//  You're entered character:
 // ch 
  }
 }
저희가 Java의 try를 쓰고 있는데...catch를 할 때 마지막에finally 자구를 추가하여 IO 자원을 닫아야 합니다. 예를 들어

InputStream is;
try{
  is=openInputStream();
  // do something
}catch(IOException e){
  e.printStaceTrace(e);
}finally{
  try{
    is.close();
  }catch(IOException e ){
  }
}
그러나 이런 모드를 사용할 때 자바 베테랑이라도 가끔 실수를 한다.예를 들어 위의 코드는 openInputStream () 함수가 실행 과정에서 이상을 던지면 변수 is의 값은null이고 이때 is를 실행합니다.close()는 NullPointerException을 내보냅니다.Null Poiter Exception은 IO Exception의 하위 클래스가 아니기 때문에catch 블록에 잡히지 않고 호출층에 직접 던져집니다.개선된 쓰기 방법은 흐름을 닫을 때 비공식 판단을 먼저 하는 것이지만, 이렇게 하면 코드가 매우 시끄러워 보일 것이다.개인적으로 비교적 우아한 글쓰기는commons-io 패키지가 제공하는 IOUtils를 직접 호출하는 것이다.closeQuitely () 방법으로 흐름을 닫거나 closeQuitely () 방법을 봉인합니다.
이러한 쓰기 방식을 사용하면 여러 IO 자원을 닫을 때 오류가 잘 발생하지 않는다는 장점이 있습니다. 예를 들어 아래의 코드:

InputStream is;
OutputStream os ;
try{
  is=openInputStream();
  // do something
}catch(IOException e){
  e.printStaceTrace(e);
}finally{
  try{
    if (is != null ) is.close();
    if (os != null ) os.close();
  }catch(IOException e ){
  }
}
당연히.close () 오류가 발생했을 때 os.close () 는 실행할 수 없기 때문에 os가 인용한 자원이 방출되지 않습니다.
아마 Oracle도 이런 try...catch ... finally의 샘플 코드는 너무 필요 없기 때문에 JDK 7에서try 자구를 개조하여 자원을 수동으로 닫는 코드를 작성하지 않고 코드를 더욱 치밀하고 간결하게 보일 수 있도록 했다.예를 들어 위의 코드는 JDK 7에서 다음과 같이 변경할 수 있다.

try(
 InputStream is = openInputStream();
 OutputStream os = openOutStream();
){
 // do something 
}catch(IOException e){
  e.printStaceTrace(e);
}
Oracle은 여기 try (...)try-with-resource 문장이라고 합니다.주의해야 할 것은try(...)변수가 인용하는 대상은 모두java를 실현해야 합니다.io.AutoClosable 인터페이스의 인스턴스, try를 종료하면...catch 블록이 있으면 JDK는 자동으로 close() 메서드를 호출합니다.즉,try-with-resource 문장의resource(자원)는 IO 자원에만 국한된 것이 아니다.
 
여기에 try-with-resource 문장의 세부 사항에 대해 보충 설명을 할 필요가 있다.
JDK는 모든 자원의 close () 방법이 호출되는 것을 확보합니다. close () 방법이 이상을 던지든 안 던지든 호출되는 순서와 자원 성명의 순서가 상반됩니다.
try-with-resource 문장에서 던져진 모든 이상이 포착됩니다.여러 개의 이상이 던져지면 뒤에 던져진 이상이suppress(억제)에 의해 이전 이상에서catch 블록은 결국 가장 먼저 던져진 이상만 가져옵니다.Throwable 클래스가 정의한 getSuppressed () 를 호출하여 suppressed (억제) 의 이상을 얻을 수 있습니다.
아니면 위의 그 예,
try를 종료하면...catch.블록을 만들 때 JDK는 os를 먼저 호출합니다.close (), 그리고 is.close (), 두 번 close () 가 모두 IOException을 던지면 is.close () 가 던진 이상이suppress (억제) 에 의해 os에 있습니다.close () 가 던진 이상 중, 최종catch 블록은 os만 잡습니다.close () 가 던진 이상입니다.getSuppressed() 방법으로 is를 받을 수 있습니다.close () 가 던진 이상입니다.
openInputStream () 을 호출할 때 IOException이 발생하면 openOutputStream () 이 호출되지 않습니다, os.close()와 is.close () 도 호출되지 않습니다.catch 블록은 openInputStream () 을 호출할 때 발생하는 이상을 포착합니다.
openOutputStream()을 호출하여 IOException(기호 e1로 표시)이 발생하면 is.close () 가 호출됩니다.close()에서 IOException(기호 e2로 표시)을 던지면 e2는suppress에 의해 e1에 포착되고catch 블록에 포착된 이상은 e1입니다.
 
트리 블록을 개조한 것 외에 JDK 7은catch 부분을 간소화하여 여러 개의catch 자구를 합칠 수 있도록 했다.예:

try(
 InputStream is = openInputStream();
 OutputStream os = openOutStream();
){
 // do something  
}catch(IOException | XMLParseException | XPathException e){
  e.printStaceTrace(e);
}
 
그 밖에 여러 개의 이상을 다시 던질 때 이상 유형을 상세하게 정의할 필요가 없습니다. 컴파일러는 구체적으로 어떤 이상을 던졌는지 알고 있습니다.방법은 정의할 때 던져야 할 이상을 성명하면 된다.예컨대

//  Exception IOException, IOException
    public void doIO() throws IOException {
      try{
        throw new IOException();
      }catch(Exception e){
        throw e;
      }
    }
PS: 이 특성이 어떤 이점을 가져올지 생각지도 못했어요
 
JDK 7에는 또 다른 재미있는 문법의 새로운 특성이 있다. 예를 들어 2진 문자의 양, 밑줄로 긴 숫자를 분할하는 것, 범용 매개 변수의 유형 추정, switch 지원 문자열의 일치 등이다.현재 JDK 8은 또 몇 가지 유용한 특성을 도입하였다.뒤로 호환되는 것을 고려할 필요가 없는 전제에서 일부 문법 특성을 적절하고 유연하게 운용하면 우리의 코드가 어느 정도에 더욱 뚜렷하고 간결하게 보일 수 있다.

좋은 웹페이지 즐겨찾기