Java 使用ImageIO.read的NullPointerException

Java 使用ImageIO.read的NullPointerException,java,nullpointerexception,javax.imageio,Java,Nullpointerexception,Javax.imageio,我在尝试读取图像文件时得到了一个NPE,我一辈子都不知道为什么。这是我的台词: BufferedImage source = ImageIO.read(new File(imgPath)); imgPath基本上保证是有效的,在它到达这里之前,它会从服务器复制文件。当它到达该行时,我得到以下堆栈跟踪: Exception in thread "Thread-26" java.lang.NullPointerException at com.ctreber.aclib.image.ico

我在尝试读取图像文件时得到了一个NPE,我一辈子都不知道为什么。这是我的台词:

BufferedImage source = ImageIO.read(new File(imgPath));
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>
线程“thread-26”java.lang.NullPointerException中的异常 在com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)上 位于com.ctreber.aclib.image.ico.icoreder.read(icoreder.java:89) 在javax.imageio.imageio.read(imageio.java:1400)中 在javax.imageio.imageio.read(imageio.java:1286)
在PrintServer.resizeImage(PrintServer.java:981)中,您是否认为文件可能已损坏,或者ImageIO试图将其读取为错误类型的文件?

您是否认为文件可能已损坏,或者ImageIO试图将其读取为错误的文件类型?

文件构造函数几乎肯定会成功,无论它是否指向有效/现有文件。至少,我会通过
exists()
方法检查您的底层文件是否存在。

文件构造函数几乎肯定会成功,不管它是否指向有效/现有文件。至少,我会通过
exists()
方法检查您的底层文件是否存在。

通过谷歌搜索ICOReader类会得到一个结果:from。
显然他们也有同样的问题:

// 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;
//        }
//    }
//使用ImageIO方法会导致如下异常。
//线程“main”java.lang.NullPointerException中出现异常
//在com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)上
//位于com.ctreber.aclib.image.ico.icoreder.read(icoreder.java:89)
//在javax.imageio.imageio.read(imageio.java:1400)中
//在javax.imageio.imageio.read(imageio.java:1322)
//位于com.jidesoft.icons.IconsFactory.b(未知来源)
//位于com.jidesoft.icons.IconsFactory.a(未知来源)
//位于com.jidesoft.icons.IconsFactory.getImageIcon(未知源)
//位于com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(未知源)
//私有静态ImageIcon createImageIconWithException(最终类基类,最终字符串文件)引发IOException{
//试一试{
//输入流资源=
//baseClass.getResourceAsStream(文件);
//if(资源==null){
//抛出新IOException(“文件”+文件+“未找到”);
//            }
//缓冲输入流=
//新的BufferedInputStream(资源);
//返回新的ImageIcon(ImageIO.read(in));
//        }
//捕获(ioe异常ioe){
//扔ioe;
//        }
//    }
他们做了什么

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]));
}
private static ImageIcon createImageIconWithException(
最终类基类,最终字符串文件)
抛出IOException{
InputStream resource=baseClass.getResourceAsStream(文件);
最终字节[][]缓冲区=新字节[1][];
试一试{
if(资源==null){
抛出新IOException(“文件”+文件+“未找到”);
}
BufferedInputStream in=新的BufferedInputStream(资源);
ByteArrayOutputStream out=新的ByteArrayOutputStream(1024);
缓冲区[0]=新字节[1024];
int n;
而((n=in.read(缓冲区[0]))>0){
out.write(缓冲区[0],0,n);
}
in.close();
out.flush();
缓冲区[0]=out.toByteArray();
}捕获(ioe异常ioe){
扔ioe;
}
if(缓冲区[0]==null){
抛出新的IOException(baseClass.getName()+“/”+文件
+“未找到。”);
}
if(缓冲区[0]。长度==0){
抛出新IOException(“警告:+文件
+“为零长度”);
}
返回新的ImageIcon(Toolkit.getDefaultToolkit().createImage(
缓冲区[0]);
}

因此,您可能希望尝试相同的方法:读取原始字节并使用
Toolkit
从它们创建图像

用谷歌搜索ICOReader类会得到一个结果:from.
显然他们也有同样的问题:

// 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;
//        }
//    }
//使用ImageIO方法会导致如下异常。
//线程“main”java.lang.NullPointerException中出现异常
//在com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)上
//位于com.ctreber.aclib.image.ico.icoreder.read(icoreder.java:89)
//在javax.imageio.imageio.read(imageio.java:1400)中
//在javax.imageio.imageio.read(imageio.java:1322)
//位于com.jidesoft.icons.IconsFactory.b(未知来源)
//位于com.jidesoft.icons.IconsFactory.a(未知来源)
//位于com.jidesoft.icons.IconsFactory.getImageIcon(未知源)
//位于com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(未知源)
//私有静态ImageIcon createImageIconWithException(最终类基类,最终字符串文件)引发IOException{
//试一试{
//输入流资源=
//baseClass.getResourceAsStream(文件);
//if(资源==null){
//抛出新IOException(“文件”+文件+“未找到”);
//            }
//缓冲输入流=
//新的BufferedInputStream(资源);
//返回新的ImageIcon(ImageIO.read(in));
//        }
//捕获(ioe异常ioe){
//扔ioe;
//        }
//    }
他们做了什么

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]));
}
private static ImageIcon createImageIconWithException(
最终类基类,最终字符串文件)
抛出IOException{
InputStream resource=baseClass.getResourceAsStream(文件);
最终字节[][]缓冲区=新字节[1][];
试一试{
if(资源==null){
抛出新IOException(“文件”+文件+“未找到”