Question

Je reçois un NPE tout en essayant de lire dans un fichier image, et je ne peux pas pour la vie de me comprendre pourquoi. Voici ma ligne:

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

imgPath est essentiellement garantie soit valide et juste avant qu'il ne soit ici il copie le fichier à partir du serveur. Quand il frappe cette ligne, je reçois cette trace de la pile:

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>

En outre, cela est jeté dans ma fenêtre de sortie:

Impossible de créer icofile: Impossible de lire octets: 2

Je ne sais pas ce qui se passe, d'autant plus que le constructeur de fichiers réussit. Je ne peux pas sembler trouver quelqu'un qui a eu un problème similaire. Quelqu'un a des idées? (Java 5, si elle fait une différence)

Était-ce utile?

La solution

Je poussé autour un peu plus et a constaté que vous pouvez spécifier ImageReader ImageIO utilisera et lire de cette façon. J'ai poussé autour de notre base de code et a constaté que nous avions déjà une fonction en place pour faire exactement ce que je voulais accomplir ici. Juste pour quelqu'un d'autre qui dirige un problème similaire, voici le point crucial du code (une partie de la merde est défini ci-dessus, mais cela devrait aider quelqu'un qui essaie de le faire):

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

Merci pour les suggestions et aider tous.

Autres conseils

Le constructeur de fichier réussira certainement, peu importe si elle pointe vers un fichier valide / existant . À tout le moins, je vérifier si votre fichier existe sous-jacent via la méthode exists().

Notez également que ImageIO.read est thread-safe (il réutilise ImageReaders mises en cache qui ne sont pas thread-safe).

Cela signifie que vous ne pouvez pas lire facilement des fichiers multiples en parallèle. Pour ce faire, vous devrez traiter ImageReaders vous.

Avez-vous pensé que le fichier peut simplement être endommagé ou que ImageIO tente de le lire comme le mauvais type de fichier?

recherche sur Google pour les résultats de la classe ICOReader en un seul coup: IconsFactory de href="https://jide-oss.dev.java.net/" rel="nofollow noreferrer"> Jide-commun .
Apparemment, ils avaient le même problème:

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

Qu'ont-ils fait à la place?

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

Vous pouvez essayer la même approche: lire les octets bruts et utiliser Toolkit pour créer une image d'eux.

  

"il est un jpeg, mais ne dispose pas d'un jpeg   l'extension. "

Cela pourrait l'être.

Il semble que la bibliothèque AC.lib-ICO est de lancer la NPE. Étant donné que cette bibliothèque est destinée à lire le format de fichier Microsoft ICO, JPEG pourrait être un problème pour elle.

Envisagez de fournir explicitement le format en utilisant un méthode alternative .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top