# Animiertes Gif anzeigen - NullPointer Exception



## 0LUMIN4T0R (17. Jan 2016)

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.

```
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:

```
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.


----------



## Hellosager (17. Jan 2016)

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.


----------



## 0LUMIN4T0R (18. Jan 2016)

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.


----------



## 0LUMIN4T0R (20. Jan 2016)

Kann mir keiner helfen?


----------



## thet1983 (21. Jan 2016)

```
//BufferedImage laden
BufferedImage img = ImageIO.read(Img.class.getClassLoader().getResourceAsStream(path));
```


----------



## 0LUMIN4T0R (21. Jan 2016)

thet1983 hat gesagt.:


> ```
> //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

```
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

```
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)
```


----------



## VfL_Freak (21. Jan 2016)

Prüfe die Zeile doch einfach mal im Debugger - da siehst Du dann doch, was genau NULL ist  ...
Gruß Klaus


----------



## thet1983 (21. Jan 2016)

"Fehler" bei mir ist das fehlende try/catch

deine klasse heißt Menu richtig?

```
// 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?


----------



## 0LUMIN4T0R (21. Jan 2016)

thet1983 hat gesagt.:


> "Fehler" bei mir ist das fehlende try/catch
> 
> deine klasse heißt Menu richtig?


Genau


thet1983 hat gesagt.:


> wo liegt dein bild?


Im Ordner des Packages und im src Ordner


VfL_Freak hat gesagt.:


> 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:

```
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

```
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)
```


----------



## VfL_Freak (21. Jan 2016)

Steht doch da: java.lang.IllegalArgumentException: input == null

Gruß Klaus


----------



## 0LUMIN4T0R (21. Jan 2016)

Da shabe ich auch herausgefunden. Ich verstehe nur nicht warum


----------



## thet1983 (22. Jan 2016)

was ist mit 
	
	
	
	





```
"src/Matrix_Anfang.gif"
```


----------



## 0LUMIN4T0R (25. Jan 2016)

Geht leider auch nicht


----------



## Natac (26. Jan 2016)

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.


----------



## 0LUMIN4T0R (26. Jan 2016)

Ohne getClassLoader () bekomme ich immer noch das gleiche Ergebnis


----------



## thet1983 (26. Jan 2016)

schreib dir einfach eine methode
in etwa so:

```
/*
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


```
JLabel lbIcon = new JLabel(new ImageIcon(loadImg("myproject/images/myPic.GIF")));
```


----------



## 0LUMIN4T0R (26. Jan 2016)

Jetzt bekomme ich beide Errors

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


```
//Hier die NullpointerException
JLabel gifLabel = new JLabel(new ImageIcon(loadImg("src/Matrix_Anfang.gif")));
```


----------



## thet1983 (27. Jan 2016)

folgender code funktioniert..
im anhang siehst du die ordner strukt.

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

}
```


----------



## Natac (27. Jan 2016)

0LUMIN4T0R hat gesagt.:


> Jetzt bekomme ich beide Errors
> 
> ```
> public static BufferedImage loadImg(String path){
> ...


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:

```
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.


----------



## 0LUMIN4T0R (27. Jan 2016)

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.

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


```
JLabel gifLabel = new JLabel(new ImageIcon(loadImg("Codex/Matrix_Anfang.gif")));
        gifLabel.setBounds(0, 0, 690, 388);
pane1.add(gifLabel, new Integer(0));
```


----------

