# java.net.MalformedURLException: no protocol:/images/Home.jpg



## sprewell (29. Apr 2008)

Hi,

ich versuche ein Bild auf/in ein Label zu zeigen.

URL url = MyIcon.class.getResource("/images/Notepad.ico");   
URL url = getClass().getClassLoader().getSystemResource("/images/Home.jpg");

So bekomme ich ständig NullPointerException.
Dass das Bild nicht in richtigen Verzeichnis steht ist nicht die Lösung. Ich habe alle möglichen Variationen versucht.

oder mit 

icon = new ImageIcon(new URL("/images/Home.ico"));

bekomme ich die Meldung: java.net.MalformedURLException: no protocol: /images/Home.ico

Ich bin echt verzweifelt und dankbar für jeden Tip.


----------



## André Uhres (30. Apr 2008)

```
label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/Home.jpg")));
```
http://www.java-forum.org/de/userfiles/user3690/Bild.jar (Quellcode im jar)


----------



## Quaxli (30. Apr 2008)

Statt


```
URL url = getClass().getClassLoader().getSystemResource("/images/Home.jpg");
```

sollte das funktionieren:


```
URL url = getClass().getClassLoader().getSystemResource("images/Home.jpg");
```

(ein / weniger)


----------



## Escorter (30. Apr 2008)

Ich bekomme da immer eine NullPointerException:


```
JMenuItem loadItem = new JMenuItem("Load XML",new ImageIcon(getClass().getClassLoader().getSystemResource("res/page_white_code.png")));
```

Wenn ich den Code so schreibe aber nicht:


```
JMenuItem loadItem = new JMenuItem("Load XML",new ImageIcon("res/page_white_code.png"));
```

Ich arbeite mit Eclipe und habe die Bilder im res Ordner, den ich später mit ins .jar packen möchte.

Gruß und Danke,

Esco


----------



## tfa (30. Apr 2008)

Wenn der Pfad, dem getClass().getResource() übergeben wird, mit einem '/' anfängt, wird er als absoluter Pfad im Classpath interpretiert. Falls nicht, wird die relative Position der entsprechenden Klasse als Ausgangspunkt verwendet. 
In dem Beispiel müsste die Datei abgelegt sein in

/der/name/des/pakets/res/page_white_code.png


----------



## Escorter (30. Apr 2008)

Ah ok. Musste die Ordner ins src Verzechnis verschieben dann klappte es.

Allerdings ohne /


```
JMenuItem loadItem = new JMenuItem("Load XML",new ImageIcon(ClassLoader.getSystemResource("res/page_white_code.png")));
```


Gruß,
Esco


----------



## sprewell (2. Mai 2008)

Hallo nochmal,

also ich habe herausgefunden, dass man den Verzeichnis, wo sich das Bild befindet, in classpath haben muss.

Soweit ist es in Ordnung. Ich bekomme keine Exception mehr. Aber ich sehe auch kein Bild/Icon auf mein Button.


----------



## Quaxli (2. Mai 2008)

Das liegt an Deinem Code in Zeile 47.


----------



## Quaxli (2. Mai 2008)

Nur für den Fall, daß das oben zu subtil ist. Ohne Deinen Code zu sehen, können wir Dir auch nicht helfen...


----------



## sprewell (2. Mai 2008)

Quaxli hat gesagt.:
			
		

> Das liegt an Deinem Code in Zeile 47.




Du meinst ich soll mein Code senden.  


public MyFrame(){
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		URL url = MyFrame.class.getResource("/images/Home.gif");
		ImageIcon icon = new ImageIcon(url);
		JButton button = new JButton(icon);

		frame.add(button);
		frame.setSize(200, 300);
		frame.setVisible(true);

}


----------



## Quaxli (2. Mai 2008)

Bei mir funzt Dein Code. Wo befindet sich das Verzeichnis "images"?
Bei mir liegt es im gleichen Ordner wie die Class-Files. Bzw. im bin-Verzeichnis, wo bei mir die kompilierten Dateien abgelegt werden.


----------



## sprewell (2. Mai 2008)

Ja bei mir liegt der Image-Verzeichnis auch unter bin, wo die class-dateien sind.
Ich weiss es nicht mehr. Du kannst echt da auf den Button ein Icon sehen ?!???
Schön, warum klappt es bei mir nicht. 
Danke trotzdem!


----------



## Quaxli (2. Mai 2008)

Die Namen des Ordners und des Files hast Du vermutlich auch schon geprüft, oder? Auch das z. B. die Endung "gif" wirklich kleingeschrieben ist, etc.?


----------



## André Uhres (3. Mai 2008)

Ich empfehle dir die schrittweise Anpassung meines obigen Projektes.
Am besten in atomaren Schritten, dann siehst du ganz genau, bei welchem Schritt es hakt.
So kannst du den Fehler entweder sofort beheben, oder das angepasste Projekt zur Korrekur an uns weiterleiten.


----------



## dzim (5. Mai 2008)

Zwei Dinge:
1) es gibt verschiedene rangehensweisen um ressource auszulesen - du willst es auch aus einer jar heraus können, da habe ich die Erfahrung mit Property-Dateien gemacht sie so zu laden:


```
// das CharacterSet der Datei (für dich eher uninteressant
Class<? extends Object> refClass = null; // die zu ladene Datei

Charset charset = null;
public Properties loadProperties( String file )
		throws FileNotFoundException, IOException
	{
		Properties result = null;
		
		if ( file != null )
		{
			// Die Methode loadPropertiesFile ist vererbt aus einer abstakten
			// Klasse, für dich uninteressant, da sie nur überprüft ob refClass
			// null ist oder nicht und dann (mit charSet) die Datei lädt
			result = loadPropertiesFile(refClass.getResourceAsStream( file ), charset);
		}
				
		return result;
	}
```

[edit]
Um dann eine Datei zu laden rufe ich diese Methode mit

```
Properties props = new Properties();
public void eineMethode() { // :-)
	FileLoader fileloader = new FileLoader();
	props = fileloader.loadProperties("properties/Properties.props");
}
```
auf.
properties/Properties.props bedeutet, das die zu ladende Datei in einem Unterordner/Unterpackage (nämlich properties) liegt (relativ zur ladenen Klasse)
[/edit]

Eine andere Variante habe ich mal für XML-Property-Dateien ausprobiert, allerdings nicht erfolgreich aus einer jar heraus.

```
ClassLoader.getSystemResourceAsStream("Properties.xml");
```

2) URL - schau dir besser mal an, wie eine URL aussehen musst, dann verstehst du deinen Fehler
Im konkreten Fall müsste es wahrscheinlich irgendwie so aussehen:
file://xxx/yyy.png
Du kannst nicht einfach das Protokoll weglassen! Dann kann es nicht gehen... (Eigene Erfahrung  )

Grüßle,
D


----------

