NullPointerException using ImageIO.read

I am getting NPE while trying to read in an image file and I cannot for the rest of my life figure out why. Here is my line:

BufferedImage source = ImageIO.read(new File(imgPath));

      

imgPath is basically guaranteed to be valid and right before it appears here it copies the file from the server. When it hits this line, I get this stack trace:

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>

      

Also, this is being thrown into my output window:

Unable to create ICOFile: Unable to read bytes: 2

I have no idea what's going on, especially since the File constructor succeeds. I cannot find anyone who has had a similar problem. Does anyone have any ideas? (Java 5 if it matters)

0


a source to share


6 answers


I slipped it a few more times and found that you can specify which ImageReader the ImageIO will use and read it that way. I poked through our code and found that we already have a function designed for EXACTLY what I am trying to do here. For anyone else who comes across a similar problem, here is the gist of the code (some of the crap is defined above, but this should help anyone trying it):

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);
}

      



Thanks for the suggestions and help everyone.

+2


a source


The file constructor will almost certainly succeed regardless of whether it points to a valid / existing file. At least I would check if your main file exists using the method exists()

.



+1


a source


Also note that ImageIO.read

it is not thread safe (it reuses cached ones ImageReader

which are not thread safe).

This means that you cannot easily view multiple files in parallel. For this you will have to deal with ImageReader

yourself.

+1


a source


Do you think that the file might just be corrupted or that ImageIO is trying to think of it as the wrong file type?

0


a source


Googling for the ICOReader class yields one result: IconsFactory

from Jide-generic .
Apparently they had the same problem:

// 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;
//        }
//    }

      

What did they do instead?

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]));
}

      

So, you can try the same approach: read the raw bytes and use them Toolkit

to create an image from them.

0


a source


"it is jpeg but does not have a jpeg extension."

It could be like that.

It looks like the AC.lib-ICO library is throwing NPE. Since this library is for reading the Microsoft ICO file format, JPEG can be a problem for it.

Consider explicitly providing a format using an alternative method .

0


a source







All Articles