Applet Fehler beim Starten

Kingkook

Aktives Mitglied
Liebe Com,

ich habe mir ein noch lange nicht fertiges,unschönes und (Logig-)Fehlerbelastetes TowerDefense programmiert.Eigentlich war als ein JFRAME, aber gerade habe ich probiert es mal als Applet laufen zu lassen.Wenn ich es in der IDE starte, funktioniert es auch mehr oder weniger.Sobald ich aber eine html schreibe, in der ich die .jar einbinde, startet er diese, aber hat dann immer folgenden Fehler :

Java:
Java Plug-in 1.6.0_22
Verwendung der JRE-Version 1.6.0_22-b04 Java HotSpot(TM) Client VM

----------------------------------------------------
c:   Konsole löschen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------


java.lang.reflect.InvocationTargetException
	at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: input == null!
	at javax.imageio.ImageIO.read(Unknown Source)
	at towerdefense.GameButtons.loadPics(GameButtons.java:65)
	at towerdefense.GameButtons.<init>(GameButtons.java:25)
	at towerdefense.GamePanel.initMenu(GamePanel.java:750)
	at towerdefense.GamePanel.<init>(GamePanel.java:115)
	at towerdefense.Applet.<init>(Applet.java:11)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(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)
Ausnahme: java.lang.reflect.InvocationTargetException

Im allgemeinen Verstehe ich den Fehler,aber ich bin Neuling im Appletsbereich.Woher kann das kommen, wo es doch in der IDE startet?

Danke im vorraus!!

mfg Kooki
 
ich vermute mal, dass die Bilder nicht gefunden werden... irgendwas stimmt mit dem Pfad nicht..

Caused by: java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at towerdefense.GameButtons.loadPics(GameButtons.java:65)
input ist null....
 
/towerdefense/"hier sind alle class Datein".class
/towerdefense/verschiedeneBilderordner/"bild.png"

Sie liegen alle in verschiedenen Ordner dort wo auch die class-Datein liegen
 
Macht es denn so einen unterschied, ob ich die Bilder in einem JFrame oder in einem JApplet nutze?Wie gesagt normalerweise läuft das Programm ja einwandfrei, auch mit den Bildern.Das einzige waqs ich verändert habe, ist eine neue Klasse JApplet, in der lediglich per

setContentPane(new MyContentPane()); das Panel übergeben wird,welches normalerweise in ein JFrame eingebettet war.
Und wie gesagt im NetBeans funktioniert das starten des Applets ja auch mit Bildern, nur nocht wenn ich das ganze direkt im Firefox oder IE anzeige wird dort der Fehler geworfen.
 
Ob JApplet oder JFrame ist erstmal egal. Worauf es ankommt ist vielmehr die Laufzeitumgebung. Deine IDE wird vermutlich den Ordner mit den kompilierten Klassen direkt in den Classpath aufnehmen, nicht das fertige Jar. Außerdem kannst du z.B. auch direkt über das Dateisystem auf deine Bildresourcen zugreifen. Es fällt also erstmal nicht auf, wenn man (in Anführungsstrichen) "unsauber" programmiert.

Im Browser läuft das Applet dann in einer restriktiven Umgebung [1] (der Sandbox). Das heiß unter anderem, dass man z.B. nur noch auf Ressourcen aus dem Classpath zugreifen kann, nicht mehr ohne weiteres aufs Dateisystem.

Läuft dein Applet denn jetzt?

[1] What Untrusted Java Code Can't Do (Ch. 2, Sec. 2) [Securing Java]
 
So wie im Link von L-ectron-X beschrieben:

Java:
image = ImageIO.read(getClass().getResource("Bild.jpg"));

Im Beispiel wird die Datei im selben Paket/Verzeichnis wie die Klasse gesucht. Du kannst aber auch einen absoluten Pfad angeben "/package/subpackage/file".
 
Momentan lade ich Bilder per :

Java:
public BufferedImage[][] loadPics(String path,int horizontal,int vertical)
        {

            BufferedImage[][] pics= new BufferedImage[horizontal][vertical];
            BufferedImage source = null;

            URL url = getClass().getClassLoader().getResource(path);

            try
                {
                        source = ImageIO.read(url);
                }
            catch (IOException e)
                {
                }

            for(int x=0;x<horizontal;x++)
                {
                    for(int y=0;y<vertical;y++)
                        {
                            pics[x][y] = source.getSubimage(x*source.getWidth()/horizontal,y*source.getHeight()/vertical,source.getWidth()/horizontal, source.getHeight()/vertical);
                        }
                }

            return pics;
        }
 
Du solltest Exceptions niemals unbehandelt lassen. Mindestens sollte der StackTrace ausgegeben werden.
[JAVA=13]catch (IOException e) {
e.printStackTrace();
}[/code]
 

Neue Themen


Zurück
Oben