2016-08-21 3 views
1

나는 이것을 이해하는 방법을 알고하지 않습니다finally {if (inputStream! = null) {inputStream.close();

{ 
     if (inputStream **!= null**) { 
      inputStream.close(); 

을 그 예에서 : 어떤 데이터가 제공 될 때

public class CopyLines { 
public static void main(String[] args) throws IOException { 

    BufferedReader inputStream = null; 
    PrintWriter outputStream = null; 

    try { 
     inputStream = new BufferedReader(new FileReader("xanadu.txt")); 
     outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); 

     String l; 
     while ((l = inputStream.readLine()) != null) { 
      outputStream.println(l); 
     } 
    } finally { 
     if (inputStream != null) { 
      inputStream.close(); 
     } 
     if (outputStream != null) { 
      outputStream.close(); 
     } 
    } 
}} 

inputStream을가 폐쇄에 beeing한다 ???

+0

'if-statement '는'NullPointerException'을 피하기위한 것입니다. – garnulf

+0

Java 버전은 무엇입니까? 이 코드는 1.7 이전 코드처럼 보입니다. – fge

+0

Java 설명서 https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html – DarekK

답변

3

그것은, try 블록은 (성공적 여부)가 완료 될 때마다 try 블록이 BufferedReader 또는 PrintWriter의 인스턴스를 만드는 동안 실패 할 수 있습니다로는 finally 블록 스트림 (inputStreamoutputStream)를 닫으려고하지만 것을 의미합니다 null이 아닌지 먼저 확인해야합니다. 그렇지 않으면 NPE가 표시됩니다.

null을 확인하고 코드를 단순화하기 위해 close()을 명시 적으로 호출하지 않으려면 try-with-resouces 문을 사용하는 것이 좋습니다.

try (BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt")); 
    PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt")) { 
    // your code here 
} 
+0

에서 가져온 것입니다. Java 설명서에 따르면 readline()은 행을 읽고 \ n (또는이 메소드에 적합한 다른 것)으로 끝나면 메소드가 읽기를 중지하고'null'을 돌려 주므로 JVM이이 프로세스를 처리합니다. 올바르게 그리고 자원 유출은 결국 발생하지 않습니까? 라인을 읽는 동안 입출력 오류가 발생하고 읽기가 제대로 끝나지 않았고 '마지막으로'블록이 그의 작업을 마칠 수 있습니다. – DarekK

+0

확실하지는 않지만 실제로 무엇을 의미하는지 알 수는 있지만 스트림이 닫히면 누출을 막을 수 있습니다. –

+0

readLine()이 어떻게 작동하는지 이해하려고합니다. JavaDocs에 따르면 corectly가 readLine()을 종료했는지 여부는 알 수 없습니다. 읽은 행 끝 표시기가있는 경우 null로 끝나거나 JVM으로 구문 분석되거나 null이 JVM으로 파싱 된 경우에만 어떤 라인도 읽지 않은 채로 EOF가있다 ... – DarekK

0

null 포인터 예외를 피하기위한 것입니다. 함수는 객체가 null이 아닌 경우에만 호출됩니다.

즉, 객체가 null이 아닌 경우에만 close 함수가 호출됩니다. 그렇지 않은 경우 close()을 null 값을 가진 객체에 호출하면 null pointer exception이 나타납니다.

흥미로운 점은 finally의 사용법입니다.이 예외는 예외가 있는지 여부에 관계없이 항상 호출됩니다.

0

실행이 finally 블록에 도달하면 먼저 inputstreamoutputstream이 null인지 확인한 다음 두 스트림을 모두 닫아 리소스를 해제합니다.

에 대한 마지막으로 시도 확인 링크를 참조하시기 바랍니다 :이 코드는 다음 finally 블록에 왜 https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.2

+0

try/finally는 나에게 분명하다. 고마워. – DarekK

1

당신이 요청하는 경우,

이 보장하는 것입니다 그 inputStreamoutputStream 것 위의 코드가 발생했는지 또는 예외가 발생하지 않든 항상 닫혀 있어야합니다.

어떻게 다른가요?

차이는 예외입니다. 예외가 발생했을 경우는, 단순한 반환 대신에,이 메소드를 호출 한 메소드에 예외를 돌려주기 전에 양쪽 모두의 스트림이 닫혀지고있는 것을 확인할 수 있습니다.

bacause 자바의 finally 블록이 항상 실행

,하지 않는 :

  • System.exit
  • 전화 또는 JVM이 충돌한다

이 스트림 데이터베이스를 종료하는 것이 일반적입니다, 또는 finally 블록의 다른 유사한 연결을 사용하십시오. 이렇게하면 연결이 항상 닫힙니다. 왜냐하면 그들이 최종 블록에 있지 않고 시스템이 계속적으로 일부 또는 다른 것을 만나기 때문에 Excpetion은 결국 연결이 끊어지기 때문입니다.

+0

아니, 나는 결국 블록에 관심이 없다. '! = null'만이 나를 흥미롭게합니다. – DarekK