Animiertes Gif anzeigen - NullPointer Exception

0LUMIN4T0R

Mitglied
Hallo zusammen,
ich würde gerne in meinem Frame ein gif anzeigen. Ich weiß dass es zu diesem Thema schon sehr viele Threads gibt, nur leider funktioniert bei mir keine Lösung davon.
Java:
        JLabel imageLabel = new JLabel(); 
//nächste Zeile ist 114
        ImageIcon ii = new ImageIcon(this.getClass().getResource("Matrix_Anfang.gif"));
        imageLabel.setIcon(ii);
frame.getContentPane().add(imageLabel);
Ich bekomme folgende Fehlermeldung:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(Unknown Source)
    at Codex.Menu.run(Menu.java:114)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Ich hoffe ihr könnt mir helfen und bedanke mich jetzt schon mal für alle Antworten.
 
Auf Anhieb fallen mir zwei mögliche Probleme ein.
Naheliegend wäre, dass du den Name des gif falsch geschrieben hast.

Ansonsten schau mal ob das gif überhaupt im src-Ordner liegt.
 
Den Namen habe ich gerade nochmal überprüft und im gleichen Ordner wie das gif liegt auch ein png. Dieses wird angezeigt wenn ich den Dateinamen ändere.😕
 
Java:
//BufferedImage laden
BufferedImage img = ImageIO.read(Img.class.getClassLoader().getResourceAsStream(path));
 
Java:
//BufferedImage laden
BufferedImage img = ImageIO.read(Img.class.getClassLoader().getResourceAsStream(path));

Bei Img meldet eclipse mir einen Fehler. HAbe den Code jetzt folgendermaßen abgeändert
Java:
 BufferedImage img = null;
        try {
//nächste Zeile ist 237
            img = ImageIO.read(Image.class.getClassLoader().getResourceAsStream("Matrix_Anfang.gif"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
Und bekomme immer noch eine NullPointerException
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Codex.Menu.run(Menu.java:237)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
 
"Fehler" bei mir ist das fehlende try/catch

deine klasse heißt Menu richtig?
Java:
// img = BufferedImage!!
// try
img = ImageIO.read(Menu.class.getClassLoader().getResourceAsStream("packagename/bildname.GIF");
// catch

// img an label uebergeben
JLabel iconLabel = new JLabel(new ImageIcon(img));
// label an panel adden
panel.add(iconLabel);

wo liegt dein bild?
 
"Fehler" bei mir ist das fehlende try/catch

deine klasse heißt Menu richtig?
Genau
wo liegt dein bild?
Im Ordner des Packages und im src Ordner
Prüfe die Zeile doch einfach mal im Debugger - da siehst Du dann doch, was genau NULL ist ...
Gruß Klaus
Hätte ich auch selbs drauf kommen können🙄 img ist null

Das ist der aktuelle Code:
Java:
 JLabel gifLabel = new JLabel();
        BufferedImage img = null;
            try {
                img = ImageIO.read(Menu.class.getClassLoader().getResourceAsStream("Matrix_Anfang.gif"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        ImageIcon Matrix = new ImageIcon(img);
        gifLabel.setIcon(Matrix);
        gifLabel.setBounds(0, 0, 1440, 1080);
Und nun ein neuer Error
Java:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at Codex.Menu.run(Menu.java:237)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
 
Bitte mal mit Menu.class.getResourceAsStream("Matrix_Anfang.gif") (Ohne "getClassLoader()") versuchen.

Ich würde auch empfehlen eine statische Methode BufferedImage createGifFrom(String resourceName) in der Klasse Menu anzulegen, die diese Details dann übernimmt.
 
schreib dir einfach eine methode
in etwa so:
Java:
/*
Bilder liegen zB im Package
myproject
  |__ images 
  |__ ....
   also lautet der path: myproject/images/myPic.GIF
*/
public static BufferedImage loadImg(String path){
     img = null;
     try{
       img = ImageIO.read(LoadImg.class.getClassLoader().getResourceAsStream(path));
     }catch(Exception e){
       e.printStackTrace();
     }
     return img;
   }

und das rufst du nun im Konstruktor des Labels auf

Java:
JLabel lbIcon = new JLabel(new ImageIcon(loadImg("myproject/images/myPic.GIF")));
 
Jetzt bekomme ich beide Errors
Java:
    public static BufferedImage loadImg(String path){
         img = null;
         try{
//hier bekomme ich die IllegalArgumentException
           img = ImageIO.read(Menu.class.getResourceAsStream(path));
         }catch(Exception e){
           e.printStackTrace();
         }
         return img;
       }
Java:
//Hier die NullpointerException
JLabel gifLabel = new JLabel(new ImageIcon(loadImg("src/Matrix_Anfang.gif")));
 
folgender code funktioniert..
im anhang siehst du die ordner strukt.
Java:
package demoIcon;

import java.awt.BorderLayout;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class IconDemo {

   private static BufferedImage img;

   /**
    * launch
    * @param args
    */
   public static void main(String[] args) {
     try{
      
       JLabel lb = new JLabel(new ImageIcon(loadImg("demoIcon/search16.png")));
      
       JFrame f = new JFrame("Demo");
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       f.getContentPane().add(lb, BorderLayout.CENTER);
       f.pack();
       f.setVisible(true);
      
     }catch(Exception e){
       e.printStackTrace();
     }
   }
  
   /**
    * load a pic
    * @param path
    * @return the pic
    */
   public static BufferedImage loadImg(String path){
     img = null;
     try{
       img = ImageIO.read(IconDemo.class.getClassLoader().getResourceAsStream(path));
     }catch(Exception e){
       e.printStackTrace();
     }
     return img;
   }

}
 

Anhänge

  • iconDemo1.GIF
    iconDemo1.GIF
    4,5 KB · Aufrufe: 35
Jetzt bekomme ich beide Errors
Java:
    public static BufferedImage loadImg(String path){
         img = null;
         try{
//hier bekomme ich die IllegalArgumentException
           img = ImageIO.read(Menu.class.getResourceAsStream(path));
         }catch(Exception e){
           e.printStackTrace();
         }
         return img;
       }
Java:
//Hier die NullpointerException
JLabel gifLabel = new JLabel(new ImageIcon(loadImg("src/Matrix_Anfang.gif")));
Die Angabe des Pfades AUF JEDEN FALL IMMER ohne "src"! Ich denke das ist schon die ganze Zeit dein Fehler. Denn Wenn das Bild ("Matrix_Anfang.gif") neben der Klasse "IconDemo" liegt, sollte IconDemo.class.getResourcesAsStream("Matrix_Anfang.gif") funktionieren.

Edit: Wirf in der Methode "loadImg" einen Fehler (meinetwegen RuntimeException), wenn das read fehlschlägt:
Java:
catch(Exception e){
  throw new RuntimeException("Failed to load img from "+path,e);
}
Den Fehler auf die Konsole rauszuschreiben und dann null zurückzugeben ist ein absolutes no-go. Entweder es kommt ein Fehler und der wird hochgereicht, oder er kann ignoriert werden weil ein Default-Wert verwendet werden kann. Beides ist bei dir nicht der Fall, deswegen bekommst du auch eine NPE.
Allgemein gilt: Nie null zurückgeben, nur in Ausnahmefällen und meist gibt es auch noch dann einen besseren weg.
 
Erstmal entschuldigung das ich euch solange aufgehalten habe. Das Bild lag tatsächlich im falschen Ordner. Jetzt wird das Bild angezeigt (ohne Fehlermeldung). Ees wird jedoch keine animation gezeigt, sondern nur das Anfangsbild.
Java:
public static BufferedImage loadImg(String path){
         img = null;
         try{
           img = ImageIO.read(Menu.class.getClassLoader().getResourceAsStream(path));
         }catch(Exception e){
           throw new RuntimeException("Failed to load png from " + path, e);
         }
         return img;
       }
Code:
JLabel gifLabel = new JLabel(new ImageIcon(loadImg("Codex/Matrix_Anfang.gif")));
        gifLabel.setBounds(0, 0, 690, 388);
pane1.add(gifLabel, new Integer(0));
 

Neue Themen


Zurück
Oben