# Musik und Java



## Martin (10. Mrz 2004)

Hallo Ihr,

wie schafft man es in einen normalen Programm (kein Applet) eine wav-Datei abzuspielen. Meine Bücher schweigen sich darüber aus, JavaDoc versteh ich nich wirklich was die meinen. Laut "Java-Insel" kann Java 1.4 wav abspielen, wenn ich nun folgen Code eingebe  kommt immer Fehlermeldung "java.net.MalformedURLException: no protocol: ding.wav"


```
...
String str = "ding.wav";
...

try {
	URL url = new URL(str);
	AudioClip clip = Applet.newAudioClip(url);
	clip.play();
} catch(MalformedURLException e) {
	System.out.println(e);
	System.exit(1);
}
```

die "ding.wav" liegt im Verzeichniss wo aich die Quelldateien liegen
der Code oben ist im Konstruktor untergebracht


----------



## Illuvatar (10. Mrz 2004)

Das Problem liegt nicht an der wav-Datei, sondern an der URL.
Das einfach so wie du zu machen, geht nicht, die muss in der Form 





> "file:///laufwerk://ordner/unterordner/unterordner(usw)/ding.wav"


 sein.
Ich habe für den Zweck mal eine Methode geschrieben:

```
private static URL getURLfromFile (File fi)
  throws java.io.FileNotFoundException,
         java.net.MalformedURLException
  {
    if (!fi.exists()){
      throw new java.io.FileNotFoundException ("File " + fi.toString() + " doesn't exist");
    }
    String s = fi.getAbsolutePath();
    StringTokenizer st = new StringTokenizer (s, "\\", false);
    String ret = st.nextToken();
    ret += "/";
    ret += st.nextToken();
    while (st.hasMoreTokens()){
      ret += "\\";
      ret += st.nextToken();
    }
    System.out.println(ret);
    return new URL ("file:\\\\\\" + ret);
  }
}
```

Dann machst du:


```
URL url = getURLfromFile(new File(str));
```


----------



## Martin (13. Mrz 2004)

Danke, das hat geholfen.
Ich hab das jetzt mal so gemacht damit ich nicht nen Vollständigen Pfad angeben muß.

```
try {	// Musik abspielen
	URL url = getClass().getResource("media"+File.separator+"ding.wav");
	AudioClip clip = Applet.newAudioClip(url);
	clip.play();
} catch(Exception me) {
        System.err.println("Fehler: GameArea.java:"+me.toString());
	System.exit(1);
}
```

Aber jetzt sagt mir Eclipse bei dem catch-Block das dieser nie erreicht wird wenn da "MalformedURLException" drinne steht, deshalb hab ich ganz labidar "Exception" genommen. Aber es funktioniert.
Is das so doof, ich möchte ja sauberen Code schreiben.


----------



## Illuvatar (13. Mrz 2004)

Das, was getClass().getResource() macht, ist das, was meine Methode getURLfromFile macht. (Wusste nicht, dass das auch so einfach geht  )
(Du kannst ja ein File auch relativ angeben).

MalformedURLException musst du nicht abfangen, weil das vermutlich innerhalb von getRessource() gemacht wird.
Wahrscheinlich musst du gar keine Exception abfangen, außer welchen, die evtl. beim Abspielen entstehen.


----------



## Martin (13. Mrz 2004)

Illuvatar hat gesagt.:
			
		

> (Du kannst ja ein File auch relativ angeben).


Das wollt ich ja damit bezwecken.

Irgend ne Exception muß ich abfangen. Ohne try-catch geht das nicht   

Da ham wa ja beide was gelernt :lol:


----------



## Martin (14. Mrz 2004)

Mußte nun doch Deine Variante nehmen. Innerhalb von Ecplipse hat das ja wunderbar funktioniert aber ausserhalb als .jar kamm immer "NullPointerException"


----------



## Illuvatar (14. Mrz 2004)

Komisch...

Noch als Anmerkung: ich vermute, dass die Methode (Edit: ich meine die von mir) unter nicht-Windows auch nicht läuft.


----------



## Haslicher (15. Mrz 2004)

HI

also bei mir ging das ohne Probleme, habs noch bissle verändert. Bei mir siehts so aus:
	
	
	
	





```
try {   // Musik abspielen
      URL url = getClass().getResource("sound/ding.wav");
      AudioClip clip = Applet.newAudioClip(url);
      clip.play();
    } catch(Exception me) {

    }
```


----------



## Illuvatar (15. Mrz 2004)

Probier vielleicht auch mal File#toURL.
Hab ich gerade in einem anderen Thread entdeckt.


----------

