ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
508
508
EMPFEHLEN
-
29.09.10 11:17 #1
- Registriert seit
- Jul 2004
- Beiträge
- 18
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
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
-
29.09.10 12:17 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
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/fid5D09493BF1...%3awrite#L1523)
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?Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
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; }
Kreiere einfach selbst einen FileImageOutputStream und verwende die ImageIO.write(RenderedImage, String, OutputStream) Methode.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
29.09.10 12:21 #3
- Registriert seit
- Jul 2004
- Beiträge
- 18
Danke - werde ich mal ausprobieren.
Melde mich umgehend wenn ich genaueres weiß.
-
Hallo Marine_of_Hell,
Ist die Variable newFilename ein gültiger Pfad? Denn sonst würdest du bereits bei new File(...)
eine NullPointerException erhalten...Code :1
ImageIO.write(imgOverlay, "png", new File(newFilename));
Trenn doch die beiden Zeilen mal...
Code :1 2
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
CKingZesiEine Frage braucht keinen Anlass, die Frage ist der Anlass selbst...
-
07.10.10 10:49 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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...
GrussGeändert von CKingZesi (07.10.10 um 11:22 Uhr) Grund: Noch was in den Sinn gekommen
Eine Frage braucht keinen Anlass, die Frage ist der Anlass selbst...
-
07.10.10 14:35 #7
- Registriert seit
- Jul 2004
- Beiträge
- 18
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
Ähnliche Themen
-
NullPointerException-Handling bei API-Nutzung
Von Tarnschaf86 im Forum JavaAntworten: 13Letzter Beitrag: 22.09.10, 09:19 -
Problem mit imageIO und ImageIcon
Von sven-ber im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 19.07.09, 22:18 -
imageIO
Von Flaschenkind im Forum Java GrundlagenAntworten: 4Letzter Beitrag: 23.10.08, 18:16 -
Problem mit ImageIO und TIFF...
Von wpb im Forum JavaAntworten: 6Letzter Beitrag: 23.08.07, 13:14 -
applet - imageio.write > access denied
Von vakem im Forum JavaAntworten: 3Letzter Beitrag: 23.04.06, 14:36





Zitieren

Login





