Argument out of range exception
Kann mir jemand sagen, warum ich immer diese exception? Gut, ich weiß, "warum" ich bin immer es ist, Ursache, die es sagt, dass das element in der Liste, die ich versuche zuzugreifen, existiert nicht, aber ein Schritt durch den code, den ich kann sehen, dass es tatsächlich existiert?
In Game1 nenne ich eine helper-Klasse' Methode der Berechnung. Dann, wenn die Berechnung abgeschlossen ist, füge ich das Ergebnis in eine Liste<> in der CalculationHelper Klasse.
Der code HIERFÜR sieht wie folgt aus:
In der Game1-Klasse, wo ich instanziiert CalculationHelper calcHelper Klasse und dann rufen Sie eine der Klassenmethoden.
Fisrt, in Game1-ich nenne calcHelper.ForceVanishingPointIntersections (...) - Methode in eine for () - Schleife, die man unten sehen kann. Das funktioniert gut und die calcHelper.ForceVanishingPointIntersections (...) - Methode fügt den Wert der IntersectionPointList<> in der CalculationHelper Klasse (siehe Methode unten).
for (int i = 0; i < LineList.Count; i++)
{
calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
AddSprite(VanishingPointIntersectionList, calcHelper.GetIntersectionPointListElementAt(i), greenCirlce);
i++;
}
Dazu einige Berechnungen an und fügen Sie einen Wert auf der IntersectionPointlist in CalculationHelper Klasse ich:
List<Vector2> IntersectionPointList = new List<Vector2>();
public void ForceVanishingPointIntersections(Line line1, Line line2)
{
Vector2 intersectionPoint;
//Do some calculations
IntersectionPointList.Add(intersectionPoint);
}
Schließlich in der Game1-Klasse, die zweite Methode in der for () - Schleife rufe ich AddSprite um ein Sprite zu erstellen. Ich möchte pass in die gespeicherten Werte in CalculationHelper Klasse IntersectionPointList als Koordinaten für das Sprite.
Zu diesem Zweck rufe ich calcHelper.GetIntersectionPointListElementAt(i) ruft eine Methode in CalculationHelper Klasse so (das sollte den Rückgabewert auf den angegebenen Punkt (i) aus dem IntersectionPointList<>)
public Vector2 GetIntersectionPointListElementAt(int index)
{
Vector2 Ergebnis = this.IntersectionPointList[index];
return Ergebnis;
}
Das erste mal die for () - Schleife, das funktioniert gut. Ich mache die Berechnungen, der Wert wird gespeichert in der Liste, und ich bin in der Lage, Holen Sie sich diesen Wert aus der Liste und übergeben es an AddSprite(..). Doch auch die zweite Runde der for () - Schleife, wenn ich Anrufe, GetIntersectionPointListElementAt aus der AddSprite () - Methode, bekomme ich eine Ausnahme in meinen
public Vector2 GetIntersectionPointListElementAt(int index)
{
Vector2 result = this.IntersectionPointList[index]; //Exception thrown here
return result;
}
sagen: der index war außerhalb des Bereichs? Aber den code schrittweise Durchlaufen, meine IntersectionPointList ist aktualisiert und es zeigt, dass die Liste enthält nun 2 Werte. Und ich versuche, auf den zweiten Wert.
Hat jemand eine Idee warum das sein könnte?
Für das Leben von mir ich kann nicht herausfinden, wohin ich gehe falsch.
Wenn mehr code benötigt wird, kann ich noch mehr posten, nur lassen Sie mich wissen,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie Zugang
LineList[]
mit einem indexi + 1
Sie abnehmen muss der Letzte index in der for-Bedingung. (Hinweis: die-1
)Diese rufen
ForceVanishingPointIntersections
mit den IndizesBeachten Sie, dass die index-Palette von
LineList
ist0 ... Count-1
.Wenn nicht-überlappenden Indizes erforderlich sind, anstatt, wie
ändern Sie dann die Schleife
BEARBEITEN Nach der Chris Gessler, Kommentare dieser zweite Ansatz ist der richtige.
Entfernen Sie die
i++
innerhalb der Schleife, es ist Recht ungewöhnlich und verwirrend. Stattdessen ersetzen Sie es durchi += 2
im loop-header.Beachten Sie auch, dass (wieder laut Chris Gessler)
IntersectionPointList
hat halb so viel Elemente wieLineList
. Deshalb rufenGetIntersectionPointListElementAt
miti /2
. Dai
ist{0, 2, 4, ... }
,i /2
ist{0, 1, 2, ...}
.Der for-Schleife können Sie eine Komma-getrennte Liste von Aussagen in der ersten und Dritten Abschnitt. Sie können es verwenden, zu warten zwei Indizes
i < LineList.Count - 1
.GetIntersectionPointListElementAt(i/2)
.Anstatt das zu tun, sollten Sie tun:
Und wenn LineList.Zählen Sie nicht sogar, zum Beispiel: 3.
Es wird bei 0 beginnen, verwenden Sie 0 und 1.
Dann springt er auf 2 verwenden Sie 2 und 3.
Aber Hoppla! es ist nicht 3!
Nur 3 zählen! 0 zu 2!
Thats, wenn Sie erhalten argument out of range exception.
Um das zu vermeiden, können Sie entweder prüfen, ob Count % 2 == 0, oder Sie können gehen, bis LineList.Count - 1, wenn Sie nichts dagegen haben, überspringen extra ' s, wenn es gibt.
Wie es aussieht, sind das hinzufügen von zwei Zeilen pro eine Sprite. Die Indizes nicht antreten. Wenn LineList hat 10 Elemente, Sie haben nur 5 IntersectionPointList Artikel, so übergeben Sie in index 9 wird scheitern.
Sollten Sie Ihre LineList-Sammlung zu
List<Tuple<string,string>>
so, dass Sie zwei Zeilen pro Eintrag, die Zeile, mit jedem Sprite. Dadurch wird eine eins-zu-eins-Beziehung zwischen den Zeilen und Sprites.Ich nehme an, man könnte immer passieren, in einen index (i /2), die sollte die richtige Sprite für je zwei Linien.