2012-08-22 3 views
5

내 응용 프로그램에서 ImageIO을 사용하여 BufferedImage을 PNG 파일로 저장하려고했습니다. 파일은 사용자가 선택하므로 문제가 될 수있는 오류 (예 : 사용자가 쓰기 권한이없는 위치에 저장하려고 시도하는 경우)에 대응해야합니다. 그러나 나는 발생하는 IOException을 잡을 수 없습니다.Java ImageIO : Exception Unirdy

다음 코드는 문제를 보여줍니다. "/ foo"에 저장하려고하면 루트 디렉토리에 쓰기 권한이 없기 때문에 * nix 시스템에서 대부분의 사용자에게 예외가 발생합니다.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class IOTest { 

    public static void main(String[] args) { 
     BufferedImage img = new BufferedImage(640, 480, 
       BufferedImage.TYPE_INT_RGB); 
     try { 
      File f = new File("/foo"); 
      ImageIO.write(img, "png", f); 
     } catch (IOException e) { 
      System.out.println("Caught IOException!"); 
     } 
    } 
} 

그러나 예외는 발견되지 않습니다. 출력 : FileNotFoundException 그래서이 잡힐한다 IOException의 서브 클래스입니다

java.io.FileNotFoundException: /foo (Permission denied) 
    at java.io.RandomAccessFile.open(Native Method) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233) 
    at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69) 
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55) 
    at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419) 
    at javax.imageio.ImageIO.write(ImageIO.java:1530) 
    at IOTest.main(IOTest.java:16) 
Exception in thread "main" java.lang.NullPointerException 
    at javax.imageio.ImageIO.write(ImageIO.java:1538) 
    at IOTest.main(IOTest.java:16) 

참고. 두 번째 catch 블록도 도움이되지 않았습니다.

catch (FileNotFoundException e) { 
    System.out.println("Caught FileNotFoundException!"); 
} catch (IOException e) { 
    System.out.println("Caught IOException!"); 
} 

내가 뭘 잘못하고 있니?

답변

6

이것은 ImageIO 구현의 세부 사항에서 비롯됩니다. File 인스턴스를 ImageIO.write으로 전달하지 않으면 문제를 피할 수 있지만 먼저 FileOutputStream을 열어 write으로 전달합니다.

이것은 ImageIO.write에서 일어나는 일을보다 정확하게 분석 한 것입니다. Line 1530 :

stream = createImageOutputStream(output); 

Line 1538 :

stream.close(); 

그리고 당신은 createImageOutputStream의 구현을 살펴, 당신은 null을 반환 몇 가지 코드 경로를 볼 수 있습니다.

4

ImageIO.write 메서드는 IOException을 인쇄하지만 실제로는 처리하지 않고 NullPointerException으로 끝나는 것처럼 보입니다. 버그가 라이브러리의이 특정한 경우에, 어쩌면 당신은 잡을 야 할 RuntimeException ... 물론

는 디렉토리가 존재하고 is writable 경우 전에 테스트하는 것이 좋습니다 것입니다.

0

ImageIO.write()FileNotFoundExceptionNullPointerException으로 래핑하는 것으로 보입니다.

ImageIO.write()을 호출하기 전에 NullPointerException을 잡거나 더 나은 파일 존재 여부를 확인해야합니다.

+3

귀하의 결론을 정당화하는 "원인"이 없습니다. –

0

보이는 것부터 보면 FileNotFoundException이 javax.imageio.ImageIO.write에서 처리되고 있으며 그 실패로 인해 널 포인터 예외가 발생하고 있습니다. 저장하기 전에 파일 사용 권한을 확인하십시오!

관련 문제