Figuren bewegen-Aufgabe mit static

  • Themenstarter Themenstarter grHenry
  • Beginndatum Beginndatum
G

grHenry

Gast
Hallo,

hätte eine Frage zu einer Klausuraufgabe. Keine Angst, will nicht die gleich Lösung, möchte nur einen bestimmten Teil der Aufgabe verstehen, dazu muss ich allerdings die ganze Aufgabe posten. Hier die Aufgabe:

Um Figuren bewegen zu können, werden Befehlsobjekte verwendet. Ein Befehlsobjekt besteht aus
einer Richtung ('N', 'O', 'S' oder 'W') und einer ganzzahligen, nicht negativen Schrittweite (>= 0).
Schreiben Sie eine Klasse CCommand, die in der Lage ist, Befehlsobjekte darzustellen. Die Klasse
soll folgende Methoden zur Verfügung stellen:
–Ein Konstruktor mit zwei Argumenten
public CCommand(char richtung, int schrittweite)
Die Argumente müssen dabei überprüft werden (d.h. Nur die Buchstaben 'N', 'O', 'S' oder 'W' und
nur die nicht negativen Schrittweiten sind erlaubt). Sie können dabei entweder assert verwenden
oder Ausnahmen auswerfen.
–Getter-Methoden zum Abfragen der Richtung und der Schrittweite.
–toString-Methode.
–equals-Methode.
–Eine Klassenmethode
public static CCommand[] vereinfachen(CCommand[] a)
zur Vereinfachung einer Menge von Befehlsobjekten. Anstatt einer langen Befehlskette wird nur ein
Array von 4 Befehlsobjekten benötigt, die die Schrittweiten in den vier Himmelrichtungen
beschreiben.

Was meint der denn mit

public static CCommand[] vereinfachen(CCommand[] a)
zur Vereinfachung einer Menge von Befehlsobjekten. Anstatt einer langen Befehlskette wird nur ein
Array von 4 Befehlsobjekten benötigt, die die Schrittweiten in den vier Himmelrichtungen
beschreiben.

Was soll die statische Methode denn vereinfachen? Ich weiß garnicht was der hier von mir erwartet?

Könnt ihr mir vielleicht auf die Sprünge helfen?
 
Zuletzt bearbeitet von einem Moderator:
Kann es vielleicht sein, dass die statische Methode ein Array von Befehlsobjekten auswerten und so vereinfachen soll, dass letztlich 4 Elemente (für jede Himmelsrichtung eine) übrig bleiben.
Das der Methode übergebenen Array mit Befehlsobjekten wäre also bezüglich der 4 Himmelsrichtungen zu addieren.
Vielleicht wäre dann auch Süd von Nord zu subtrahieren, wenn die Summe der Schritte nach Nord größer ist, als die Summe nach Süd, sich die Schritte also teilweise aufheben. (Süd wäre dann z.B. 0). Analog Ost-West.
 
Kann es vielleicht sein, dass die statische Methode ein Array von Befehlsobjekten auswerten und so vereinfachen soll, dass letztlich 4 Elemente (für jede Himmelsrichtung eine) übrig bleiben.
Das der Methode übergebenen Array mit Befehlsobjekten wäre also bezüglich der 4 Himmelsrichtungen zu addieren.

Vielleicht wäre dann auch Süd von Nord zu subtrahieren, wenn die Summe der Schritte nach Nord größer ist, als die Summe nach Süd, sich die Schritte also teilweise aufheben. (Süd wäre dann z.B. 0). Analog Ost-West.
Absatz 1 ist was gemeint ist, absatz 2 würde über die aufgabenstellung hinausgehen
 
Ich verstehe leider noch immer nicht was ihr meint, könnt ihr mir vielleicht ein Codebeispiel für die Methode geben?
 
Du kannst mir gerne eine PM schreiben und mir sagen, was dir eine Lösung wert ist.

Sonst wirst du dich schon ein wenig anstrengen müssen.
 
Habs jetzt versucht so zu lösen:

Code:
public static CCommand[] vereinfachen(CCommand[] a)
	{
		CCommand befehlsobjektNord = new CCommand('N', 0);
		CCommand befehlsobjektSued = new CCommand('S', 0);
		CCommand befehlsobjektOst = new CCommand('W', 0);
		CCommand befehlsobjektWest = new CCommand('O', 0);
		
		for(int i=0; i<a.length; i++)
		{
			int schrittweite = a[i].getSchrittweite();
			char richtung = a[i].getRichtung();
			
			if(richtung == 'N')
			{
				befehlsobjektNord.setSchrittweite(befehlsobjektNord.getSchrittweite() + schrittweite);
			}
			else if(richtung == 'S')
			{
				befehlsobjektSued.setSchrittweite(befehlsobjektSued.getSchrittweite() + schrittweite);
			}
			else if(richtung == 'O')
			{
				befehlsobjektOst.setSchrittweite(befehlsobjektOst.getSchrittweite() + schrittweite);
			}
			else if(richtung == 'W')
			{
				befehlsobjektWest.setSchrittweite(befehlsobjektWest.getSchrittweite() + schrittweite);
			}
		}
		
		return a;

mit diesem Testcode in main:

Code:
	CCommand[] array = 
			{ 
				new CCommand('S', 5), 
				new CCommand('N', 2),
				new CCommand('O', 5),
				new CCommand('W', 1),
				new CCommand('S', 6),
				new CCommand('O', 3),
				new CCommand('S', 5),
				new CCommand('N', 8)
			};
				
		array = CCommand.vereinfachen(array);
		
		for(int i=0; i<array.length; i++)
		{
			array.toString();
		}

erhalte folgende Exception:

Exception in thread "main" java.lang.NullPointerException
at CCommand.vereinfachen(CCommand.java:63)
at CCommand.main(CCommand.java:105)


bei Zeile 63 handelt es ich um folgende Zeile:

int schrittweite = a.getSchrittweite();

Warum tritt die NullPointerException auf?
 
Dazu musst du zuerst einmal erkennen was alles
Code:
null
sein könnte, und das wäre:
Java:
int schrittweite = a[i].getSchrittweite();
-
Code:
a
, das Array selber ist
Code:
null
-
Code:
a[i]
, das Element an der Stelle
Code:
i
ist
Code:
null

Kannst du etwas davon ausschliessen?
Ja, denn das Array selber wird weiter oben schon mal aufgelöst, es kann also nicht
Code:
null
sein:
Java:
for(int i=0; i<a.length; i++)
(obwohl ich trotzdem eine Überprüfung des Parameters am Anfang der Methode machen würde)

Was bleibt also übrig?
Es gibt Elemente im Array, welche
Code:
null
sind.

Was solltest du dagegen tun?
Je nachdem, was das gewünschte Verhalten ist; entweder, diese Einträge werden einfach ignoriert (am wahrscheinlichsten), oder du brichst die Methode mit einer Exception ab (welche ihr wohl noch nicht hattet).
 
Was bleibt also übrig?
Es gibt Elemente im Array, welche
Code:
null
sind.

Was solltest du dagegen tun?
Je nachdem, was das gewünschte Verhalten ist; entweder, diese Einträge werden einfach ignoriert (am wahrscheinlichsten), oder du brichst die Methode mit einer Exception ab (welche ihr wohl noch nicht hattet).

Ok, es gibt Elemente im Array die Null sind, was aber dagegen tun, meines Erachtens dürfte es keine Elemnte im Array geben die Null sind.

Folgender Code in der Methode vereinfachen führt beispielsweise auch zu einer NullPointerExceoption:

Code:
a[0].getSchrittweite();

Außerhalb der Methode wird a[0] aber doch eindeutig mit Werten per Konstruktor initialisiert:

Code:
CCommand[] array = 
			{ 
				new CCommand('S', 5), 
				new CCommand('N', 2),
				new CCommand('O', 5),
				new CCommand('W', 1),
				new CCommand('S', 6),
				new CCommand('O', 3),
				new CCommand('S', 5),
				new CCommand('N', 8)
			};

toString funktioniert:

Code:
System.out.println(a[0].toString());

Sobald ich aber mit Hilfe der getMethode auf ein Attribut zugreifen möchte gibt es die NullPointerException, warum ist das so?

Code:
System.out.println(a[0].getSchrittweite());
 
dann ist nicht a null sondern nur die schrittweite im element a

zeig mal deine commando klasse
 

Neue Themen


Zurück
Oben