문제

여기에 몇 가지 답변을 제공하고 몇 가지 의견을 읽은 후에는 실제로 IOException이 파일 I/O에 가까워지지 않는 것 같습니다.

스트림/리더/작가에서 Close에 전화를 걸어 실제로 IOException을 던지는 경우가 있습니까?

실제로 예외가 발생하면 어떻게 처리해야합니까?

도움이 되었습니까?

해결책

파일의 경우 ioexception이 Close ()에 자주 던져지는 것을 볼 수 없지만 네트워크에 닫는 소켓과 같은 비 파일 I/O에 대해서는 확실히 볼 수 있습니다.

여기 예입니다 UDP 소켓을 닫으면 결국 IOException이 발생하는 Java 버그의 경우.

다른 팁

두 가지 사례를 발견했습니다.

  • 버퍼에 플러시 할 데이터가 여전히있을 때 네트워크 연결을 잃습니다.
  • 버퍼에 플러시 할 데이터가 여전히있을 때 파일 시스템이 채워 지거나 파일 크기의 사용자 제한에 도달하는 경우 (또는 파일 크기에 대한 사용자 제한에 도달).

이 두 가지 예는 버퍼에 여전히 데이터가있는 동안 일어나는 일에 의존합니다. 닫기 파일이 닫히기 전에 버퍼를 플러시하므로 파일에 데이터를 쓰는 오류가 있으면 ioexception이 발생합니다.

네트워크 드라이브에서 작성할 파일 이름을 전달한 다음 코드를 실행 한 다음 Enter 키를 누르기 전에 네트워크 케이블을 플러그를 플러그로 눌러 프로그램이 IOException을 닫게합니다.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Test
{
    public static void main(final String[] argv)
    {
        final File file;

        file = new File(argv[0]);
        process(file);
    }

    private static void process(final File file)
    {
        Writer writer;

        writer = null;

        try
        {
            writer = new FileWriter(file);
            writer.write('a');
        }
        catch(final IOException ex)
        {
            System.err.println("error opening file: " + file.getAbsolutePath());
        }
        finally
        {
            if(writer != null)
            {
                try
                {
                    try
                    {
                        System.out.println("Please press enter");
                        System.in.read();
                    }
                    catch(IOException ex)
                    {
                        System.err.println("error reading from the keyboard");
                    }

                    writer.close();
                }
                catch(final IOException ex)
                {
                    System.err.println("See it can be thrown!");
                }
            }
        }
    }
}

Java 7이므로 Try-With-Resources를 사용 하여이 혼란에서 벗어날 수 있습니다 (명시 적 예외 생성 코드가 제거되었습니다. close() 작업):

private static void process(final File file) {
    try (final Writer writer = new FileWriter(file)) {
        writer.write('a');
    } catch (final IOException e) {
        // handle exception
    }
}

이것은 예외를 자동으로 처리합니다 close() 그리고 그것은 명시 적으로 수행합니다 null 내부적으로 확인하십시오.

그것이 일어날 때, 그것은 다른 것과 같이 처리해야합니다. IOException, 자주 추천하는 것처럼 조용히 무시하지 않습니다. 가정은 스트림을 사용하여 완료되었으므로 제대로 청소되었는지 여부는 중요하지 않다고 가정합니다.

그러나 제대로 청소하는 것이 중요합니다. 만약 close() 작업은 예외를 제기하며, 일부 출력을 플러시하고 일부 트랜잭션 (읽기 전용이라고 생각한 데이터베이스 연결의 경우) 등을 저지르는 것 등이 예외가 발생할 가능성이 높습니다. 그리고 드물기 때문에 작업을 중단시켜 응용 프로그램의 신뢰성을 크게 손상시키지 않습니다.

구체적으로입니다 FileInputStream.close 하드 드라이브가 불에 타더라도 던지지 않습니다. 아마도 소켓 입력과 동일합니다. 출력 스트림의 경우 플러시 할 수도 있습니다. 비교적 최근까지 [타임 스탬프 참조 BufferedOutputStream 기본 스트림을 닫지 못했습니다 flush 던졌다.

(@MaartenBodewes는 내가 그것을 지적하기를 원합니다 FileInputStream.close 던지는 것은 API 문서에 의해 지정되지 않습니다. 게시물 당시에는 이것이 Sun JDK (현재 Oracle JDK 및 OpenJDK라고도 함)와 관련이 있음을 언급하는 조항을 피하는 것이 관례였습니다. 안드로이드가 사용했던 아파치 하모니 (Apache Harmony)라는 모호한 이전의 재 구현은 다른 행동을 가질 수있는 것으로 보인다. 잠재적으로 다른 구현 또는 OpenJDK 버전도 던질 수 있습니다.)

가까이에 전화 할 때 일어날 수있는 일, 예외 숨기기에 영향을 줄 수있는 방법 및 이에 대해 할 수있는 일에 대한 조사 : 블로그 게시물.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top