Fehler in BlueJ

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
xrtm4e
Beiträge: 9
Registriert: 05.11.2011 11:48:23

Fehler in BlueJ

Beitrag von xrtm4e » 27.02.2012 15:32:05

Hey,

ich muss gerade das Spiel Pacman in Java programmieren und das zwangsmäßig mit BlueJ (Schule verlangt das). Ich programmiere hauptsächlich in C, habe deshalb wenig Erfahrungen mit BlueJ und allgemein Java. Habe angefangen das Spiel in der Schule zu programmieren, bin auch recht weit. In der Schule hat das Ausführen problemlos geklappt, doch jetzt bekomme ich eine Fehlermeldung wenn ich es an meinem PC ausführen möchte, welcher lautet:

Code: Alles auswählen

java.lang.IllegalAccessError: tried to access method DarstellungImpl.FuellFarbeSetzen(Ljava/lang/String;)V from class ZELLENSYMBOL
	at ZELLENSYMBOL.<init>(ZELLENSYMBOL.java:19)
	at ZELLE.<init>(ZELLE.java:14)
	at LABYRINTH.<init>(LABYRINTH.java:18)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at bluej.runtime.ExecServer$3.run(ExecServer.java:740)
Ich verstehe nicht was das bedeuten soll. Damit wir es ausführen können müsse wir das jar-Paket 'backend.jar' in BlueJ laden, was ich gemacht habe. Wie gesagt, in der Schule funktioniert es problemlos.

Wäre sehr dankbar für Hilfe.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Fehler in BlueJ

Beitrag von Liffi » 28.02.2012 06:08:19

Ist die Methode FuellFarbeSetzen public?

Was passiert, wenn du es testweise in einer anderen IDE versuchst, z.B. eclipse oder netbeans (in einem Terminal geht es evtl. auch, aber wenn du das noch nicht gemacht hast, ist eine IDE sicher von Vorteil).

xrtm4e
Beiträge: 9
Registriert: 05.11.2011 11:48:23

Re: Fehler in BlueJ

Beitrag von xrtm4e » 28.02.2012 14:28:58

ja sie ist public.

scheint auch nicht zu funktionieren, hier mal ein bild wie es aussieht. ich glaube es liegt an dem 'super' ... was auch immer das ist -- http://s1.directupload.net/file/d/2814/awkmtmgn_png.htm

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Fehler in BlueJ

Beitrag von Liffi » 29.02.2012 06:21:40

xrtm4e hat geschrieben:ich glaube es liegt an dem 'super' ... was auch immer das ist
Der erste Aufruf von super(xNeu, yNeu) erzeugt ein Objekt der Klasse von der ZELLENSYMBOL (ueblicherweise wuerde man das Zellensymbol schreiben) ableitet, also eine ZellDarstellungsImpl Instanz. Mit super.FuellFarbeSetzen(fuellfarbe) wird dann die Methode FuellFarbeSetzen(fuellfarbe) der Basisklasse aufgerufen.
Was mir nicht ganz klar ist: In der Fehlermeldung wird DarstellungsImpl.FuellFarbeSetzen aufgerufen, nicht ZellDarstellungsImpl.FuellFarbeSetzen. Moeglicherweise liegt der Fehler da irgendwo begraben.

artemis
Beiträge: 447
Registriert: 21.12.2005 23:11:11

Re: Fehler in BlueJ

Beitrag von artemis » 29.02.2012 10:37:44

Hallo.

Ich bin jetzt schon ein paar Jahre von Java weg, aber hier mal meine Erinnerungen zu super().

Du hast die Klasse ZELLENSYMBOL, welche die Klasse ZellDarstellungImpl erweitert.

super bezieht sich nun immer auf die Basisklasse, also ZellDarstellungImpl. Dies muss nur angegeben werden, wenn nicht klar ist, welche Methode gewählt werden soll. Das ist wichtig, wenn du eine Methode der Basisklasse in deiner Klasse überschreibst, aber trotzdem noch auf die Methode der Basisklasse zugreifen möchtest. Sonst braucht man das nicht.

Durch das super(...) rufst du den Konstruktor der Basisklasse auf. Ohne super() wird bei der Objekterstellung nur dein Konstruktor aufgerufen (und der default Konstruktor der Basisklasse. Daher muss das super(...) auch immer am Anfang deines Konstruktors stehen. Gibt es in der Basisklasse keinen default Konstruktor (parameterlos), dann musst du den immer angeben.

Ansonsten brauchst du super nicht. Wenn es in deiner Klasse keine Methode FuellFarbeSetzen gibt, dann wird automatisch die der Basisklasse aufgerufen.

Daher kann ich dein "int positionX = super.positionX;" nicht nachvollziehen. Du kannst jederzeit auf positionX der Basisklasse zugreifen, auch ohne super.

Beispiel:

Code: Alles auswählen

public class Eins {

  public int x = 0;

  public Eins() {
   // Ich bin ein Default Konstruktor
   x = 1;
  }

  public Eins(int x) {
   this.x = x;
  }

  public int xplus(int y) {
   return x + y;
  }
}

public class Zwei extends Eins {
  public Zwei() {
   super(3); // Sonst wäre x = 1;
   println("X: " + x); // Ergebnis: 3
   println("X plus 5: " + xplus(5)); // Ergebnis: 8
}
 


Ohne Gewähr und ungetestet.

Da würde ich mal ansetzen. Damit du die richtigen Methoden aufrufst. Vielleicht hilft dir das weiter.

Beachte noch, dass man in Java eigentlich immer Getter und Setter verwendet und die Members selten public. Im Gegensatz zu den Properties von anderen Sprachen. Daher ist mein Beispiel mit "public int x" nicht so toll.

Bis dann,
artemis

artemis
Beiträge: 447
Registriert: 21.12.2005 23:11:11

Re: Fehler in BlueJ

Beitrag von artemis » 29.02.2012 10:46:25

Achso, und noch was.

Hast du schon versucht, alle *.class Dateien zu löschen und neu anlegen zu lassen. Also quasi sowas wie "make clean"?
Laut Beschreibung darf "IllegalAccessError" nämlich nie auftreten, da dieser Fehler vom Compiler abgefangen werden sollte.

Bis dann,
artemis

xrtm4e
Beiträge: 9
Registriert: 05.11.2011 11:48:23

Re: Fehler in BlueJ

Beitrag von xrtm4e » 01.03.2012 19:53:31

Hi,

erstmal vielen Dank @artemis für die ausführliche Antwort. Folgendes: Die Klasse ZELLENSYMBOL war bereits vorprogrammiert von jemand anderem, wie verwenden sie nur in der Schule damit es einfacher wird, kann dir also nicht genau sagen was sich der Programmierer der Klasse dabei gedacht hat. Ich habe das Problem jetzt jedoch gelöst: Wir verwenden in der Schule die BLueJ Version 3.0.2, ich jedoch die Version 3.0.5. Ich habe testweise die Version 3.0.2 installiert und jetzt funktioniert alles einwandfrei.

Nochmals vielen Dank @artemis und @Liffi

Antworten