# Minesweeperprogrammierung Fehler J0098



## Visio (6. Aug 2005)

Hallo Leute,

wusste leider nicht, ob ich ins Anfängerforum oder hierher schreiben soll *g*

Jedenfalls bin ich bei der Programmierung von Mineweeper und bin auf
ein kleines Problem gestoßen:

Ich habe 3 Klassen: Feld, spielfeld und MeinMouseListener

Im spielfeld habe ich ein Array aus Feldern deklariert und jedem Feld einen
Mouselistener hinzugefügt.

Wenn man auf ein Feld klickt, soll der MouseListener dieses Feld aufdecken.
Dafür habe ich den MouseListener das FeldArray mit übergeben und wollte
dann die nichtstatische Funktion "Aufdecken" in der klasse spielfeld durch folgenden
Funktionsaufruf aufrufen:


```
FeldArray2.Aufdecken(Zeile, Spalte, zahl);
```

Leider kommt dann die Fehlermeldung:
Zugriffsversuch auf ein nicht vorhandenes Element von "Feld[][]" (J0098).

Würde mich freuen, wenn mir jemand beim lösen meines Problems behilflich sein 
könnte


----------



## Soulfly (6. Aug 2005)

Ist dein array überhaupt initiiert und gefüllt. 
Oder sind die Koordinaten, die benutzt werden, größer als die Arraydimensionen?
Die Felder sind nämlich größer als ein Pixel.

ansonsten gibt mal die ganze Fehlermeldung raus.


----------



## GagamehlO (7. Aug 2005)

Was ist den die Klasse Feld?
Wurde sie von Component abgeleitet?
Und zum Mouse Listener hinzufügen.
mach doch einfach im Konstruktor der Klasse Feld:

this.addMouseListener(MouseListener-Interface).....


Den Fehler finde ich irgendwie merkwürdig.
Steht denn sonst nichts mehr dabei?
Denn wenn das Array noch nicht initialisiert wurde, würde der Compiler ja eine Null-Pointer Exception liefern (oder nicht?)

mhmmm????
Gib mal bitte die Komplette Fehlermeldung aus (hoffe sie war noch nicht komplett)


----------



## Visio (10. Aug 2005)

Hallo Leute, 
danke für eure schnellen Antworten.
Leider war dies die komplette Fehlermeldung, die ausgegeben wird.
Habe hier mal die 3 Klassen (n paar Funktionen rausgelöscht, dass
es wenigstens n bisschen übersichtlicher wird  :roll: ):

Klasse Feld:


```
import java.awt.*;

public class Feld extends Button
	
{
	protected int Zahl = 0;
	protected int Markiert = 0;
	protected int Aufgedeckt = 0;
}
```

Klasse MeinMouseListener:


```
import java.awt.event.*;

public class MeinMouseListener implements MouseListener
{	
	
	int zahl;
	Feld[][] FeldArray2;
	int Zeile;
	int Spalte;
	int Zeilen;
	int Spalten;
	Statusleiste Status;
	
	

	public MeinMouseListener(Feld[][] FeldArray, int z, int s,int i, int Z, int S, Statusleiste status)
	{
		zahl = i;
		FeldArray2 = FeldArray;
		Zeile = z;
		Spalte = s;
		Zeilen = Z;
		Spalten = S;
		Status = status;
	}
	
	public void mouseClicked(MouseEvent e)
	{
		int mask = InputEvent.BUTTON1_MASK - 1;
		int mods = e.getModifiers() & mask;
		if (mods == 0)
		{
			FeldArray2.Aufdecken(Zeile, Spalte, zahl);
		}
		
		else	//Rechtsklick
		{
			if (FeldArray2[Zeile][Spalte].Aufgedeckt != 1)
			{
				if (FeldArray2[Zeile][Spalte].Markiert == 0)
				{
				Aussehen.Fahne(FeldArray2, Zeile, Spalte, Status);
				}
				if (FeldArray2[Zeile][Spalte].Markiert == 1)
				{
				Aussehen.Fragezeichen(FeldArray2, Zeile, Spalte, Status);
				}
				if (FeldArray2[Zeile][Spalte].Markiert == 2)
				{
				Aussehen.Unberuehrt(FeldArray2, Zeile, Spalte);
				}
				FeldArray2[Zeile][Spalte].Markiert++;
				
				if (FeldArray2[Zeile][Spalte].Markiert == 3)
				{
				FeldArray2[Zeile][Spalte].Markiert = 0;	
				}
			}
		}
		//repaint();
	}
	
	public void mouseEntered( MouseEvent e ) {}
	public void mouseReleased( MouseEvent e ) {}
	public void mouseExited( MouseEvent e ) {}
	public void mousePressed( MouseEvent e ) {}
}
```

Und die Klasse spielfeld:

```
import java.awt.*;

public class spielfeld extends Panel
{
	protected Feld[][]FeldArray;
	protected int Minen;
	protected int x;
	protected int y;
	protected int Zeilen;
	protected int Spalten;
	Statusleiste Status;
	
	
	public spielfeld (int zeilen, int spalten, int AnzahlMinen, Statusleiste status)
	{
		
		Zeilen = zeilen;
		Spalten = spalten;
		Minen = AnzahlMinen;
		Status = status;	
		
		Font myFont = new Font("Arial", 8, 8);
		setFont(myFont);
		
		
		FeldArray = new Feld[Zeilen][Spalten];
	
		setLayout(new GridLayout(Zeilen,Spalten,0,0));
		for(int z=0;z<Zeilen;z++)
		{
		for (int s=0;s<Spalten;s++)
		{
			FeldArray[z][s] = new Feld();
			add(FeldArray[z][s]);
		}
		}	
		
		
		
		for (int i=1; i <= Minen; i++) 	
		{
			x = (int) (Math.random() * Zeilen);
			y = (int) (Math.random() * Spalten);
			
			if (FeldArray[x][y].Zahl == 9)
			{
				i--;
			}	
			else
			{
				FeldArray = SetzeMine(FeldArray, x, y);
			}	
		}
		
		for(int z=0;z<Zeilen;z++)
		{
		for (int s=0;s<Spalten;s++)
		{
			FeldArray[z][s].addMouseListener(new MeinMouseListener(FeldArray,z,s,FeldArray[z][s].Zahl,Zeilen,Spalten,Status));
		}
		}	
	}
	
		

		
		public void Aufdecken(int Zeile, int Spalte, int zahl)
	{		
		if (FeldArray[Zeile][Spalte].Aufgedeckt != 1)
		{
			if (FeldArray[Zeile][Spalte].Markiert != 1)
			{
				if (zahl == 0)
					Leer(FeldArray, Zeile, Spalte, Zeilen, Spalten);	
				if (zahl > 0 && zahl < 9)
					{Aussehen.Zahl(FeldArray, Zeile, Spalte, zahl);
					FeldArray[Zeile][Spalte].Aufgedeckt = 1;}
				if (zahl == 9)
					{Aussehen.Mine(FeldArray, Zeile, Spalte);
					FeldArray[Zeile][Spalte].Aufgedeckt = 1;}
			}
		}
	}
	
}
```


----------



## Soulfly (10. Aug 2005)

Warum machst du dir das so komliziert?

Du übergibst jedem MouseListener das gesamte Feldarray.
Gibt diesem doch einfach nur das Feld das dieser benutzt(keine Angst, das funktioniert).
Damit wird die verwaltung schon mal um einiges leichter.

Die Wurzel des Problems kann darin stecken aber ich würde es erstmal umschreiben.


----------



## Visio (10. Aug 2005)

Lool, keine Angst, das hätte ich als nächstes gemacht.

Wollte erst mal dieses Problem lösen.
Werde aber morgen das Programm umschreiben und
wenn das Problem noch besteht den neuen Quellcode
ins Forum setzen.


----------



## Visio (10. Aug 2005)

Also, war neugierig, ob es dann funktioniert, aber leider
gings nach der Verbesserung auch nicht. 

Hier was in der Hilfe steht:

Compilerfehler J0098
Zugriffsversuch auf nicht vorhandenes Element von "Bezeichner"

Der Compiler hat das angegebene Array-Element gefunden, es konnte jedoch nicht identifiziert werden. Dieser Fehler tritt meist dann auf, wenn bei dem Versuch, eine length-Methode eines Array zu referenzieren, ein Schreibfehler vorliegt. Dieser Fehler kann auch auftreten, wenn der Versuch unternommen wird, eine Methode in einem Array aus Objekten aufzurufen, der Aufruf jedoch keines der Elemente des Array referenziert.

Das folgende Beispiel veranschaulicht diesen Fehler:

```
public class Simple {
   
   public void method1() {
      String j[] = new String[10];
      // Initialisierung der Array-Elemente hier einfügen 
      String str = j.toUpperCase();
      // Fehler: Array-Klammern '[]' fehlen
   }
}
```

Vielleicht kann einer von euch was damit anfangen  :?


----------



## Soulfly (10. Aug 2005)

Entschuldige, ich bin ziemlich blond. Hätte mir schon von Anfang an auffallen  müssen.
 :autsch: 

Dein Problem liegt einfach daran, dass du keinen index auf das Array zeigen lässt

 FeldArray2.Aufdecken(Zeile, Spalte, zahl);

so sollte das aussehen

 FeldArray2[Zeile][Spalte].Aufdecken(..bla..);

Du hast da einen ziemlich fetten Denkfehler gemacht.
Du musst die MouseListener und Feld Kommunikation nochmal überdenken.
Du muss jetzt dein Programm noch ein wenig weiter ummodeln, damit du nicht irgendwas doppelt gemoppelt machst.


----------



## Visio (10. Aug 2005)

Tjo, das dachte ich mir auch schon   

Das war aber nicht das Problem. Anstatt dem
FeldArray hätte ich die Klasse spielfeld mitsenden
müssen, da die Funktion ja eine Funktion
der Klasse spielfeld und nicht vom FeldArray ist   

Jedenfalls funktionierts etz. Muss natürlich das Programm
n bisschen verschönern, aber das kann ja nicht mehr das Problem
sein.

Danke für eure Hilfe !


----------

