NullPointerException bei der Nutzung von ImageIO.write

Marine_of_Hell

Grünschnabel
Moin!

Ich habe hier ein seltsames Problem und weiß so langsam nicht mehr weiter.
Wenn ich ImageIO.write nutze, erhalte ich (nach einiger Zeit!) eine NPE!

Hier mal mein Code:

Code:
		if(mainImg == null || overlayImgUrl == null)
			return null;
		
		String ovPartName = overlayImgUrl.substring(overlayImgUrl.lastIndexOf("/") + 1);
		ovPartName = ovPartName.substring(0, ovPartName.indexOf("."));
		
		String newFilename = mainImg.substring(mainImg.lastIndexOf("/") + 1);
		newFilename = newFilename.substring(0, newFilename.indexOf(".")) + ovPartName + ".png";

		if((new File(newFilename)).exists())
			return CMSGetImage.readPicture(newFilename);
		
		try {
			
			BufferedImage imgProfile = ImageIO.read(new File(mainImg));
			Image imgScaledProfile = imgProfile.getScaledInstance(149, 149, Image.SCALE_SMOOTH);

			URL overlayImage = new URL(overlayImgUrl);
			BufferedImage imgOverlay = ImageIO.read(overlayImage);
			BufferedImage imgOrgOverlay = ImageIO.read(overlayImage);
	        
			Graphics2D newGraphic = imgOverlay.createGraphics();
	        newGraphic.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
	        newGraphic.drawImage(imgScaledProfile, 6, 6, null);
	        newGraphic.drawImage(imgOrgOverlay, 0, 0, null);
	        newGraphic.dispose();
	        
			ImageIO.write(imgOverlay, "png", new File(newFilename));
			
			log.debug("Returning: " + newFilename);
			return CMSGetImage.readPicture(newFilename);
			
		} catch (IOException e) {
			log.error(e.getMessage(), e);
			return null;
		} catch(Exception e) {
			log.debug("Catching all Exceptions: " + e.getMessage(), e);
			return null;
		}

Als NPE Exception kommt:
Code:
2010-09-29 10:42:55,208 [TP-Processor8] DEBUG com.mpass.cmsmobile.components.CMSGetImage  - Catching all Exceptions: null
java.lang.NullPointerException
        at javax.imageio.ImageIO.write(ImageIO.java:1523)
        at com.mpass.cmsmobile.components.CMSGetImage.setOverlayImage(CMSGetImage.java:240)
        at com.mpass.cmsmobile.components.CMSGetImage.getImage(CMSGetImage.java:181)
        at com.mpass.apps.cmsmobile.servlets.CMSGetImage.doGet(CMSGetImage.java:60)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
        at java.lang.Thread.run(Thread.java:619)

Die Variablen "mainImg" und "overlayImgUrl" sind richtig gesetzt - also nicht null. Sonst würde er ja nicht entsprechend soweit laufen.
Die Exception kommt aus der Zeile "ImageIO.write(imgOverlay, "png", new File(newFilename));" (hier Zeile 28).

Wie gesagt - die Methode läuft mehrmals täglich ohne Probleme durch. Erst nach einiger Laufzeit stellt er den Betrieb mit der NPE ein.

Für Ideen/Vorschläge/Verbesserungen bin ich jederzeit zu haben. ;)

Danke für eure Hilfe schon mal.

Gruss,
Thomas
 
Hi.

Die NPE tritt anscheinend auf weil in ImageIO.write versucht wird einen Stream zu schließen, der nicht geöffnet wurde (siehe http://koders.com/java/fid5D09493BF...s=cdef:javax.imageio.ImageIO+mdef:write#L1523)

Java:
public static boolean write(RenderedImage im,
                                String formatName,
                                OutputStream output) throws IOException {
        if (output == null) {
            throw new IllegalArgumentException("output == null!");
        }
        ImageOutputStream stream = null;
        try {
            stream = createImageOutputStream(output);
        } catch (IOException e) {
            throw new IIOException("Can't create output stream!", e);
        }

        boolean val;
        try {
            val = write(im, formatName, stream);
        } finally {
            stream.close(); // Zeile 1523
        }
        return val;
    }
Das Problem ist, dass createImageOutputStream (Zeile 9) null zurückgeben kann, was dann zu der NPE führt. Anscheinend findet die Methode für dein File Objekt in der Service Registry keinen passenden ImageOutput-Provider... Evtl. hast du die Registrierungen geändert?

Kreiere einfach selbst einen FileImageOutputStream und verwende die ImageIO.write(RenderedImage, String, OutputStream) Methode.

Gruß
 
Hallo Marine_of_Hell,

Ist die Variable newFilename ein gültiger Pfad? Denn sonst würdest du bereits bei new File(...)
Code:
ImageIO.write(imgOverlay, "png", new File(newFilename));
eine NullPointerException erhalten...

Trenn doch die beiden Zeilen mal...

Code:
File file = new File(newFilename);
ImageIO.write(imgOverlay, "png", file);

So siehst du ob das File oder das ImageIO den Fehler verursacht...

Freundliche Grüsse
CKingZesi
 
Hi.
Ist die Variable newFilename ein gültiger Pfad? Denn sonst würdest du bereits bei new File(...)
Code:
ImageIO.write(imgOverlay, "png", new File(newFilename));
eine NullPointerException erhalten...
Nur wenn newFilename null ist.
Trenn doch die beiden Zeilen mal...

Code:
File file = new File(newFilename);
ImageIO.write(imgOverlay, "png", file);

So siehst du ob das File oder das ImageIO den Fehler verursacht...
Die NPE kommt aus javax.imageio.ImageIO.write(ImageIO.java:1523) wie im Stack Trace eindeutig zu sehen war und nicht aus java.io.File.

Gruß
 
Hey,

Ist schon klar das mit dem Stack-Trace. Wollte nur auf Nummer sicher gehen. Wie sieht eigentlich der restliche Code aus? Aufruf? Return-Werte, usw...

Mir ist noch was in den Sinn gekommen: Hast du mal ein anderes Bildformat versucht? Vielleicht ist der Codec irgendwie nicht vorhanden...

Gruss
 
Zuletzt bearbeitet:
Moin!

Danke für eure Hilfe und entschuldigt das ich so spät antworte.
Ich habe die Methode mit FileImageOutputStream erfolgreich probiert. Das hat das Problem also gelöst.

Gruß,
Thomas
 

Neue Beiträge

Zurück