tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
508
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Marine_of_Hell Marine_of_Hell ist offline Mitglied
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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)

    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;
        }
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Marine_of_Hell Marine_of_Hell ist offline Mitglied
    Registriert seit
    Jul 2004
    Beiträge
    18
    Danke - werde ich mal ausprobieren.
    Melde mich umgehend wenn ich genaueres weiß.
     

  4. #4
    CKingZesi CKingZesi ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    62
    Hallo Marine_of_Hell,

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

    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
    CKingZesi
     
    Eine Frage braucht keinen Anlass, die Frage ist der Anlass selbst...

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.169
    Hi.
    Zitat Zitat von CKingZesi Beitrag anzeigen
    Ist die Variable newFilename ein gültiger Pfad? Denn sonst würdest du bereits bei new File(...)
    Code :
    1
    
    ImageIO.write(imgOverlay, "png", new File(newFilename));
    eine NullPointerException erhalten...
    Nur wenn newFilename null ist.
    Zitat Zitat von CKingZesi Beitrag anzeigen
    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...
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    CKingZesi CKingZesi ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    62
    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
    Geä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...

  7. #7
    Marine_of_Hell Marine_of_Hell ist offline Mitglied
    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

  1. NullPointerException-Handling bei API-Nutzung
    Von Tarnschaf86 im Forum Java
    Antworten: 13
    Letzter Beitrag: 22.09.10, 09:19
  2. Problem mit imageIO und ImageIcon
    Von sven-ber im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 19.07.09, 22:18
  3. imageIO
    Von Flaschenkind im Forum Java Grundlagen
    Antworten: 4
    Letzter Beitrag: 23.10.08, 18:16
  4. Problem mit ImageIO und TIFF...
    Von wpb im Forum Java
    Antworten: 6
    Letzter Beitrag: 23.08.07, 13:14
  5. applet - imageio.write > access denied
    Von vakem im Forum Java
    Antworten: 3
    Letzter Beitrag: 23.04.06, 14:36

Stichworte