2016-06-23 24 views
-1

Mit edwards Code überarbeitet, ich dies jetzt haben:Arraylist Fehler Beteiligung außerhalb der Grenzen Ausnahme

 int k, l, tempA, tempB; 
    for (k = 0; k < 13; k++) { 
    for (l = 0; l < 4; l++) { 
    tempA = rndm.get(k); 
    tempB = suit.get(l); 
    // increment # and convert into string 
    buttonNumber++; 
    buttonName = Integer.toString(buttonNumber); 
    // assign new button to the array 
    cardButton[k * 4 + l] = new JButton(buttonName); 
    // assign button image icon 
    cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]); 
    // assign value to the check variable 
    check[k * 4 + l] = Integer.toString(tempA+1); 
    // make button invisible for now 
    cardButton[k * 4 + l].setVisible(false); 
    // add the button to the board 
    board.add(cardButton[k * 4 + l]); 
} 

}

aber mein Problem dabei ist, dass ich einen Ersatz für die verschachtelte Schleife, weil die Art und Weise müssen Es ist jetzt eingerichtet, es zeigt X-Wert in 4 verschiedenen Farben an, bevor der nächste Wert angezeigt wird, wenn ich es brauche, um x-Wert und x-Farbe anzuzeigen, ohne einen Wert einmal zu wiederholen, es sei denn, es wird zufällig gemacht. Der Grund dafür liegt in der verschachtelten Schleife, die einmal durch k und dann viermal durchläuft.

+1

Wenn 'l' 4 ist, was bedeutet' j <52 || k <13 || l <4' bewerten zu? – shmosel

+0

"Aber mein Problem ist, dass ich vorher die Werte innerhalb des Arrays gesetzt habe." Sie denken eindeutig, dass Sie Werte im Array haben, aber Sie liegen falsch. Die ArrayList hat nicht nur entschieden, dass deine 4 Gegenstände wie alle anderen 5-9 statt 0-3 nummeriert sind. Hmmm. Index 4, wo die verfügbaren Werte sind 0, 1, 2, 3 ... – John3136

+0

Beseitigen Sie jede Instanz von 'j'. Sie brauchen nichts davon, einschließlich der 'for-Schleife'. Ersetzen Sie dann jede Instanz von "j" durch "k * 4 + l", und platzieren Sie Ihren Code innerhalb der "l" -Schleife, wobei "tempA" und "tempB" definiert werden. Das sollte es beheben. –

Antwort

0

Ich glaube, Ihr for-loop Zustand ist falsch. j < 52 || k < 13 || l < 4 wird True bis j >= 52 zurückgegeben. Wenn Sie Ihren Code betrachten, wird dadurch ein Out-of-bounds-Fehler ausgelöst, da k und l ebenfalls auf 52 erhöht werden. Wenn ich Sie wäre, würde ich sie in separate Bedingungen setzen.

Es erscheint (entsprechend Ihrem Kommentar), dass Sie über ein 2D-Array iterieren möchten. In diesem Fall würde ich 2 for-loops:

for (k = 0; k < 13; k++) { 
    for (l = 0; l < 4; l++) { 
     tempA = rndm.get(k); 
     tempB = suit.get(l); 
     cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]); 
     check[k * 4 + l] = Integer.toString(tempA+1); 
    } 
} 

Beachten Sie, dass wir Ihre j Variable mit etwas Mathe stattdessen sind zu ersetzen. Jedes Mal, wenn Sie Ihre l Schleife durchlaufen, wird k um eins erhöht. So können wir sagen, auf welcher Karte wir sind, indem wir k mit 4 multiplizieren, da l 4 mal durchlaufen wird. Wenn wir l hinzufügen, können wir die aktuelle Karte erhalten, die Sie betrachten. Dieser Code sollte direkt aus der Box funktionieren.

Bearbeiten: Ihr vollständiger Code sollte wie folgt sein.

int k, l, tempA = 0, tempB = 0; 
    // create temporary variables 
for (k = 0; k < 13; k++) { 
    for (l = 0; l < 4; l++) { 
     tempA = rndm.get(k); 
     tempB = suit.get(l); 
     // increment # and convert into string 
     buttonNumber = buttonNumber+1; 
     buttonName = Integer.toString(buttonNumber); 
     // assign new button to the array 
     cardButton[k * 4 + l] = new JButton(buttonName); 
     // assign button image icon 
     cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]); 
     // assign value to the check variable 
     check[k * 4 + l] = Integer.toString(tempA+1); 
     // make button invisible for now 
     cardButton[k * 4 + l].setVisible(false); 
     // add the button to the board 
     board.add(cardButton[k * 4 + l]); 
    } 
} 

Auch anstelle buttonNumber = buttonNumber + 1 zu tun, Sie buttonNumber++

+0

Ich habe das versucht, aber das scheint der einzige Weg zu sein, könntest du mir helfen, das herauszufinden, wenn ich den Rest des Codes poste? –

+0

Was versuchen Sie mit dieser Schleife zu erreichen? –

+0

// Zuweisen Schaltfläche Bildsymbol cardButton [j] .setIcon (cardImage [tempA] [tempB]); // Wert der Prüfvariablen zuweisen check [j] = Integer.toString (tempA + 1); // mache Knopf unsichtbar für jetzt –

0

verwenden Wenn Sie jede Permutation von rndm und suit zu bekommen sind versuchen, werden Sie eine verschachtelte Schleife benötigen:

for (int i = 0; i < 13; i++) { 
    for (int j = 0; j < 4; j++) { 
     tempA = rndm.get(i); 
     tempB = suit.get(j); 
     //... 
    } 
} 
0

Sie missverstehen, wie logische Operatoren funktionieren. Doppelter vertikaler Balken ist "oder" Operator. Es benötigt zwei Ausdrücke, die in boolesche Werte umgewandelt werden können, und gibt "true" zurück, wenn mindestens einer davon wahr ist.

boolean test = (1 == 2 || 5 < 3); 
// test == true 

Ihre for-Schleife iteriert außerhalb der Array-Grenzen. Lassen Sie uns Ihren Code ein wenig vereinfachen. Lassen Sie uns zwei Arrays mit fester Größe erstellen, 1 und 2 Elemente, und durchlaufen Sie sie dann in einer ähnlichen Schleife wie Ihre.

Integer[] arrayA = new Integer[1]; 
Integer[] arrayB = new Integer[2]; 

for (int i = 0, j = 0; i < 1 || j < 2; i++, j++) { 
    arrayA[i] = i; // Will throw ArrayIndexOutOfBounds 
    arrayB[j] = j; 
} 

Nun wollen wir sehen, wie die Zähler während der Schleifenausführung ändern:

  1. i == 0 und j == 0, i < 1 == true und j < 2 == true, erhöhen wir sowohl
  2. i == 1 und j == 1, i < 1 == false aber noch j < 2 == true, ein der Bedingungen ist wahr (und wir brauchen nur eine, um wahr zu sein, damit || operator True zurückgibt), also wird der Schleifencode e ausgeführt ven obwohl i index ist außerhalb der Grenzen!

Ihr Code löst aus dem gleichen Grund eine Ausnahme aus. Auch wenn l < 4 == false, wird die gesamte Bedingung true ausgewertet, daher wird der Schleifencode ausgeführt.

Was Sie wollen, ist all die || Betreiber && zu ändern:

for (j = 0, k = 0, l = 0; j < 52 && k < 13 && l < 4; j++, k++, l++) 

Sie können hier mehr über Boolesche Algebra und die Differenz zwischen and und or Operatoren lesen - http://www.tutorialspoint.com/computer_logical_organization/boolean_algebra.htm

Auf einer seitlichen Anmerkung , mach keine Schleifen so. So viele Variablen in einer Aussage sind sehr verwirrend, wie Sie vielleicht bemerkt haben. Erwägen Sie die Verwendung von enchanced for loops, wenn Sie immer auf Objekte mit exakt demselben Index wie Ihre Zählervariable zugreifen.

+0

ich bekomme jetzt einen anderen Fehler: Ausnahme im Thread "main" java.lang.NullPointerException –

+0

Bitte lassen Sie mich wissen, wie dies behoben werden kann –

+0

Ich schrieb es in der Antwort, je nachdem, was Sie tun möchten (weil ich ' Ich bin mir nicht sicher), Sie sollten 'oder' Operatoren durch' ersetzen und 'so:' für (j = 0, k = 0, l = 0; j <52 && k <13 && l <4; j ++ , k ++, l ++) '. – Jezor

Verwandte Themen