2009-05-18 9 views
0

이미지 파일을 읽는 동안 NPE가 표시되는데 그 이유를 알 수 없습니다. 여기에 내 라인이있다 :ImageIO.read를 사용하여 NullPointerException이 발생했습니다.

imgPath는 기본적으로 유효하며, 도착하기 전에 바로 서버에서 파일을 복사한다. 그것은 그 라인을 칠 때, 나는이 스택 트레이스 얻을 : 또한

Exception in thread "Thread-26" java.lang.NullPointerException 
    at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120) 
    at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89) 
    at javax.imageio.ImageIO.read(ImageIO.java:1400) 
    at javax.imageio.ImageIO.read(ImageIO.java:1286) 
    at PrintServer.resizeImage(PrintServer.java:981) <---My function 
    <Stack of rest of my application here> 

을, 이것은 내 출력 창에 발생합니다 :

ICOFile를 만들 수 없습니다 : 2

: 바이트를 읽을 수 없습니다 무슨 일이 일어나고 있는지, 특히 File 생성자가 성공한 이후로 나는 잘 모른다. 비슷한 문제가있는 사람을 찾을 수없는 것 같습니다. 아무도 아이디어가 없나요? (Java 5의 차이가있을 경우)

+0

ICOReader 클래스는 어디에서 제공됩니까? –

+0

위치를 포함한 전체 스택 추적을 포함하도록 문제를 업데이트했습니다. – Morinar

답변

2

필자는 좀 더 자세히 훑어 보았고 ImageReader ImageIO가 어떤 방식으로 사용하고 읽을 것인지 지정할 수 있습니다. 나는 코드베이스를 훑어 보았고 여기에서 성취하려고했던 것을 정확히 수행 할 수있는 기능을 이미 갖추고있는 것으로 나타났습니다. 그냥 비슷한 문제로 실행되는 다른 사람에 대한, 여기에 코드의 핵심이다 (쓰레기 중 일부는 위의 정의는,하지만이 시도하는 사람이 그것을하는 데 도움이됩니다) : 제안에 대한

File imageFile = new File(filename); 
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("jpeg"); 
if (imageReaders.hasNext()) { 
    imageReader = (ImageReader)imageReaders.next(); 
    stream = ImageIO.createImageInputStream(imageFile); 
    imageReader.setInput(stream, true); 
    ImageReadParam param = imageReader.getDefaultReadParam(); 
    curImage = imageReader.read(0, param); 
} 

감사합니다 모든 것을 도와주세요.

0

파일이 손상되었거나 ImageIO가 잘못된 유형의 파일로 읽으 려한다고 생각 했습니까?

+0

좋은 생각인데 파일이 확실히 유효합니다 ... 이미지 뷰어에서 열어 볼 수 있습니다. 그것이 잘못된 유형의 파일로 그것을 읽으려고하고있을 가능성이 있습니다 ... jpeg이지만 jpeg 확장자가 없습니다. 그게 문제가 될 수 있을까요? – Morinar

1

유효/기존 파일을 가리키는 지 여부와 관계없이 File 생성자가 거의 확실하게 성공합니다. . 최소한, 기본 파일이 exists() 메소드를 통해 존재하는지 확인합니다.

+0

"if file.exists()"블록 내부에 읽기 라인을 놓았습니다. 그리고 거기에 그것을 만들었고 똑같은 방식으로 실패했습니다. – Morinar

0

ICOReader 클래스의 인터넷 검색 결과는 IconsFactory에서 jide-common까지입니다.
은 분명히 그들은 같은 문제를 겪고 :

// Using ImageIO approach results in exception like this. 
// Exception in thread "main" java.lang.NullPointerException 
//   at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120) 
//   at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89) 
//   at javax.imageio.ImageIO.read(ImageIO.java:1400) 
//   at javax.imageio.ImageIO.read(ImageIO.java:1322) 
//   at com.jidesoft.icons.IconsFactory.b(Unknown Source) 
//   at com.jidesoft.icons.IconsFactory.a(Unknown Source) 
//   at com.jidesoft.icons.IconsFactory.getImageIcon(Unknown Source) 
//   at com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(Unknown Source) 

// private static ImageIcon createImageIconWithException(final Class<?> baseClass, final String file) throws IOException { 
//  try { 
//   InputStream resource = 
//     baseClass.getResourceAsStream(file); 
//   if (resource == null) { 
//    throw new IOException("File " + file + " not found"); 
//   } 
//   BufferedInputStream in = 
//     new BufferedInputStream(resource); 
//   return new ImageIcon(ImageIO.read(in)); 
//  } 
//  catch (IOException ioe) { 
//   throw ioe; 
//  } 
// } 
가 대신 무엇을 했는가

? 원시 바이트를 읽고 그들로부터 이미지를 만들 수 Toolkit를 사용

private static ImageIcon createImageIconWithException(
     final Class<?> baseClass, final String file) 
     throws IOException { 
    InputStream resource = baseClass.getResourceAsStream(file); 

    final byte[][] buffer = new byte[1][]; 
    try { 
     if (resource == null) { 
      throw new IOException("File " + file + " not found"); 
     } 
     BufferedInputStream in = new BufferedInputStream(resource); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(1024); 

     buffer[0] = new byte[1024]; 
     int n; 
     while ((n = in.read(buffer[0])) > 0) { 

      out.write(buffer[0], 0, n); 
     } 
     in.close(); 
     out.flush(); 
     buffer[0] = out.toByteArray(); 
    } catch (IOException ioe) { 
     throw ioe; 
    } 

    if (buffer[0] == null) { 
     throw new IOException(baseClass.getName() + "/" + file 
       + " not found."); 
    } 
    if (buffer[0].length == 0) { 
     throw new IOException("Warning: " + file 
       + " is zero-length"); 
    } 

    return new ImageIcon(Toolkit.getDefaultToolkit().createImage(
      buffer[0])); 
} 

그래서 당신은 동일한 방법을 시도 할 수 있습니다.

+0

흠 ... 나는 인터넷 검색을 할 때 그것을 보았지만 분명히 그 페이지의 소스를 자세히 읽지 않았기 때문에 주석 처리 된 문제와 새로운 솔루션을 볼 수있었습니다. 확실히 작동하는 것처럼 보이지만 하나의 실패 라인을 해결하는 코드가 많은 것처럼 보입니다 (슬픈 표정). – Morinar

0

"jpeg이지만 확장자가 입니다."

그럴 수도 있습니다.

라이브러리 AC.lib-ICO이 NPE를 던지고있는 것처럼 보입니다. 이 라이브러리는 Microsoft ICO 파일 형식을 읽으므로 JPEG가 문제가 될 수 있습니다.

명시 적으로 alternative method을 사용하여 형식을 제공하는 것을 고려하십시오.

1

또한 ImageIO.read은 스레드로부터 안전하지 않습니다 (스레드로부터 안전하지 않은 캐시 ImageReader을 다시 사용함).

즉, 여러 파일을 쉽게 읽을 수 없습니다. 그렇게하려면 ImageReader 님과 직접 거래해야합니다.

관련 문제