1

画像ファイルを読み込もうとしているときに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>

また、これは私の出力ウィンドウにスローされます:

ICOFileを作成できません:バイトを読み取れません:2

特にFileコンストラクターが成功しているので、何が起こっているのかわかりません。同様の問題を抱えている人は誰もいないようです。誰かアイデアはありますか?(それが違いを生む場合はJava 5)

4

6 に答える 6

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

提案に感謝し、すべてを助けます。

于 2009-05-18T17:02:07.750 に答える
1

File コンストラクターは、有効な/既存の file を指しているかどうかに関係なく、ほぼ確実に成功します。少なくとも、exists()メソッドを介して基になるファイルが存在するかどうかを確認します。

于 2009-05-18T16:27:54.213 に答える
0

「これはjpegですが、jpeg拡張子はありません。」

それかもしれません。

ライブラリAC.lib-ICOがNPEをスローしているようです。このライブラリはMicrosoftICOファイル形式を読み取ることを目的としているため、JPEGが問題になる可能性があります。

別の方法を使用して形式を明示的に提供することを検討してください。

于 2009-05-18T16:57:26.527 に答える
0

ファイルが単に破損している可能性がある、または ImageIO が間違ったタイプのファイルとして読み取ろうとしていると考えましたか?

于 2009-05-18T16:21:57.753 に答える
0

ICOReader クラスをグーグル検索すると、jide-commonIconsFactoryから1 つのヒットが発生します。 どうやら彼らは同じ問題を抱えていたようです:

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

彼らは代わりに何をしましたか?

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

したがって、同じアプローチを試してみることをお勧めします。生のバイトを読み取り、Toolkitそれらからイメージを作成するために使用します。

于 2009-05-18T16:39:56.530 に答える