# Objekt Arrays mit externen Methodenaufruf



## vaporizer (24. April 2004)

Hallo

also.. ich hab eine Klasse "MyClass"
in dieser Klasse kann ich ein StringArray erzeugen mit beliebig vielen Elementen
ich hab Methoden wie zB eingeben()

```
import javax.swing.*;
public class MyClass 
{
private int last=0;
private int all=0;
private String[] vary;
public MyClass(int anz) 
{
all=anz;
	vary = new String[anz];
}
public static void main(String[] args) 
{
	MyClass Arr = new MyClass(10);
	Arr.eingeben();
	Arr.ausgeben();
}
public String readString()
		{
			String eing;
			eing = JOptionPane.showInputDialog("Wert der weiteren Elemente eingeben:");
			return eing;
		}
	public void eingeben()
	{
		int i=0;
		String name = readString();
		while(! name.equals("quit"))
		{
			vary[i] = name;
			i++;
			name = readString();
		}
		last=i;
	}
	public void ausgeben()
	{
		for(int i=0; i<all; i++)
		{
			System.out.println("index"+i+": "+vary[i]);
		}
	}
}
nun hab ich eine zweite klasse
mit einer Attribute copien.. ein ObjektArray der Klasse MyClass
hier der Code:
public class CopyShop 
{
	private MyClass[] copien; 

	public static void main(String[] args) 
	{
		CopyShop copy = new CopyShop(10);
		copy.varyBuilt(0);
		copy.varysOut();
	}
	public CopyShop(int anz)
	{
		copien = new MyClass[anz];
	}
	public void varyBuilt(int index)
	{
		copien[index].eingeben();
		copien[index].ausgeben();
	}
	public void varysOut()
	{
		int i=0;
		while(i < 1)
		{
			copien[i].ausgeben();
			i++;
		}
	}
}
```

nur leider funktionieren die externen Methodenaufrufe nicht
copien[index].eingeben();
copien[index].ausgeben();
Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at CopyShop.varyBuilt(CopyShop.java:30)
at CopyShop.main(CopyShop.java:21)

was mache ich falsch?

und noch eine Frage: ist es Möglich über die Attribute copien
die Main Methode von MyClass aufzurufen?

würde mich freun wenn mir jemand weiter hilft

Schöne Grüße von vaporizer


----------



## vaporizer (24. April 2004)

hab dieses Thema gerade etwas weiter unten endeckt..
also erst mal entschuldige ich mich für meine Unachtsamkeit
und für meinen Datenmüll den ich mal wieder verursacht habe..

aber zum Thema...ich hab es ja expliziet istanziert..
aber die Methode ruft er trotzdem nicht auf..
und es ist ja der selbe Fehler wie bei dem anderen unten
funktioniert das nicht mit Arrays?


----------



## Snape (28. April 2004)

vaporizer hat gesagt.:
			
		

> Hallo
> also.. ich hab eine Klasse "MyClass"
> in dieser Klasse kann ich ein StringArray erzeugen mit beliebig vielen Elementen
> ich hab Methoden wie zB eingeben()
> ...



Schau Dir mal Deine while-Schleife an:

```
while(! name.equals("quit"))
{
	vary[i] = name;
	i++;
	name = readString();
}
```
Das heisst doch, so lange das Wort "quit" nicht eingegeben wird, rödelst Du immer wieder durch diese Schleife. ABER: Du benutzt ungeschickterweise ein Array namens vary. Warum ungeschickt? Weil Arrays üblicherweise nicht dynamisch größer werden. D.h. wenn so oft Eingaben getätigt werden, bis die Größe des vary-Arrays aus dem Ruder läuft, kracht es natürlich. In Deinem Fall wird es also bei der 11. Eingabe krachen, weil Du das Array auf 10 Elemente dimensioniert hast. Einfacher und weniger fehleranfällig ist die Verwendung einer ArrayList, siehe API.



> und noch eine Frage: ist es Möglich über die Attribute copien
> die Main Methode von MyClass aufzurufen?



Ganz einfach: In den Methoden eingeben() und ausgeben() wird auf das Array zugegriffen, was aber noch gar nicht initialisiert wurde im Konstruktor MyClass(int anzahl). Du rufst nämlich copien = new MyClass[anzahl] auf. Siehst Du den Unterschied?
Du müsstest also einfach eine kleine for-Schleife anlegen, z.B.


```
public CopyShop(int anz)
{
copien = new MyClass[anz];
for ( int i = 0; i < copien.length; i++ )
{
copien[i] = new MyClass( anz );
}
```

Erst dann hast Du für jedes Deiner copien-Objekte auch tatsächlich ein handfestes MyClass Objekt hinterlegt. Ohne dem sind alle Deine copien[] nämlich NULL. Mit copien = new MyClass[anz]; erzeugst Du keine Instanzen von MyClass, sondern Du definierst einfach nur, dass das copien-Array aus MyClass Objekten bestehen soll und eine Größe von anz hat. Mehr nicht. Verständlich?


----------

