Frage

Ich erhalte eine NPE beim Versuch, in einer Image-Datei zu lesen, und ich kann nicht für das Leben von mir herauszufinden, warum. Hier ist meine Linie:

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

imgPath ist grundsätzlich garantiert gültig und richtig sein, bevor es hier kopiert er die Datei vom Server bekommt. Wenn es diese Zeile trifft, ich diese Stack-Trace erhalten:

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>

Auch diese geworfen in mein Ausgabefenster:

Kann nicht ICOFile erstellen: Kann nicht Bytes lesen: 2

Ich habe keine Ahnung, was los ist, vor allem, da der Datei-Konstruktor gelingt. Ich kann nicht scheinen, jemanden zu finden, der ein ähnliches Problem gehabt hat. Jemand irgendwelche Ideen? (Java 5, wenn das macht keinen Unterschied)

War es hilfreich?

Lösung

stieß ich um einiges mehr und festgestellt, dass Sie die Imagereader ImageIO wird verwenden können festlegen, und es auf diese Weise lesen. Ich stocherte unsere Code-Basis und fand, dass wir bereits eine Funktion an Stelle hatten genau für das, was ich versuche, hier zu erreichen. Nur für alle andere, die in ein ähnliches Problem läuft, hier ist der Kern des Codes (ein Teil des Mists wie oben definiert ist, aber das sollte jemand helfen, der versucht, es zu tun):

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

Danke für die Vorschläge und helfen alle.

Andere Tipps

Der Datei-Konstruktor wird mit ziemlicher Sicherheit gelingen, , unabhängig davon, ob er auf eine gültige / existierende Datei . Zumindest würde ich prüfen, ob die zugrunde liegende Datei über die exists() Methode existiert.

Sie auch, dass ImageIO.read zu beachten ist nicht Thread-sicher (es gecached ImageReaders wieder verwendet, die nicht Thread-sicher sind).

Dies bedeutet, dass Sie nicht einfach mehrere Dateien parallel lesen können. Um das zu tun, werden Sie mit ImageReaders selbst zu tun haben.

Haben Sie darüber nachgedacht, dass die Datei einfach beschädigt werden kann, oder dass ImageIO versucht, es als die falsche Art von Datei zu lesen?

für die ICOReader Klasse ergibt einen Treffer Googeln: IconsFactory von jide-common .
Offenbar hatten sie das gleiche 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;
//        }
//    }

Was haben sie stattdessen?

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 möchten Sie vielleicht den gleichen Ansatz versuchen: die rohen Bytes lesen und verwenden Toolkit ein Bild von ihnen zu erstellen.

  

"Es ist ein jpeg, aber nicht über eine jpeg   Erweiterung. "

Das könnte es sein.

Es scheint, dass die Bibliothek AC.lib-ICO das wirft NPE. Da diese Bibliothek sollte das Microsoft ICO-Datei-Format lesen, ein JPEG könnte ein Problem für sie.

Betrachten Sie das Format mit einem alternative Methode .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top