2017-04-01 5 views
0

Ich möchte eine Methode schreiben, die ein Deck von einem Spiel anzeigt. I initialisiert eine Array mit 98 Elementen
Testen, ob ein Array leer ist JUNIT

private int [] cards = new int[98]; 

ich auch ein Get- und Set-Methode

public int[] getCards() { 
    return cards; 
} 
erstellt

und

public void setCards(final int... cards) { 
    this.cards = cards; 
} 

Die Methode I drawCard genannt wird geschrieben. Wenn ich diese Methode verwende, sollte sie das erste Element aus dem Array entfernen und es zurückgeben.

public int drawCard() throws IndexOutOfBoundsException { 
    if (getCards().length == 0) { 
     throw new IndexOutOfBoundsException("No Cards Left!"); 
    } 
    setCards(ArrayUtils.removeElement(getCards(), 0)); 
    return getCards()[0]; 
} 

Und dann schrieb ich den JUnit Test. Der Test sollte alle 98 Elemente entfernen und dann sollte das Array leer == 0 sein. Aber der Test stoppt immer an 1.

@Test 
public void testDrawCard() { 
    Deck deck = new Deck(); 
    assertThat(deck.getCards().length).isEqualTo(98); 

    for(int x = 98; x >= 0; x--){ 
     deck.drawCard(); 
    } 
    assertThat(deck.getCards().length).isEqualTo(0); 
} 

Fehlermeldung:

java.lang.ArrayIndexOutOfBoundsException: 0 
at edu.hm.hafner.java2.thegame.Deck.drawCard(Deck.java:35) 

35 = Rückleitung

at edu.hm.hafner.java2.thegame.DeckTest.testDrawCard(DeckTest.java:40) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

Kennt jemand was falsch ist?

+0

Sie sind von 98 bis! inklusive! 0. – Androbin

+0

Sie versuchen, 99 Elemente zu entfernen. – Androbin

+0

Ändern Sie einfach die> = zu einer einfachen> – Androbin

Antwort

0

@ajb ist richtig, aber wenn man nach hinten normalerweise durchlaufen wollen, beginnen Sie mit Länge - 1 weil Indizes mit 0, so dass in Ihrem Stil zu starten, sollte die Schleife

for(int x = 98 - 1; x >= 0; x--) 

Aber wie auch immer sein , Sie verwenden nicht die x-Variable innerhalb der Schleife, so dass die Reihenfolge keine Rolle spielen sollte, solange Sie genau 98 Elemente zeichnen.

1

Dies führt die Schleife während x >= 0. Das heißt, wenn wir x dekrementieren und es den Wert 0 erhält, führen wir die Schleife erneut aus, weil 0 >= 0 wahr ist. Dann dekrementieren wir x und finden, dass es -1 ist, also stoppt die Schleife. Dies bedeutet, dass die Schleife für x = 98, 97, 96, ..., 2, 1, 0 ausgeführt wird. Es gibt 99 Zahlen in dieser Liste, so dass die Schleife 99 mal ausgeführt wird.

Da Sie x überhaupt nicht verwenden, gibt es keinen Grund, dass es oben beginnt und nach unten geht. Wenn der einzige Zweck der Schleife, um sicherzustellen, ist genau 98-mal ausgeführt, dann nicht klug erhalten - nur die Standard-for Schleife Idiom verwenden:

for (int i = 0; i < 98; i++) 

Es macht keinen Unterschied zu der Ausführung des Programms machen . Aber indem Sie sich an die Standard-Idiome halten, außer wenn es notwendig ist, werden Sie einige Gehirnzellen speichern und am Ende mit viel weniger Fehlern enden, um herauszufinden.

+0

Vielen Dank für Ihre Antwort. Aber wenn ich die Schleife in ändern 'i = 0, i <98, i ++' Ich bekomme immer noch die gleiche Ausnahme Die Fehlermeldung sagt mir immer, es ist etwas falsch mit der Return-Anweisung, aber ich bekomme es nicht – Konstantin

+0

Sagt die Fehlermeldung wörtlich: "Es ist etwas falsch mit der Rückkehr Aussage"? Oder liefert es mehr Informationen? Bitte verstecken Sie keine wichtigen Informationen von uns. Selbst wenn du nicht verstehst, was es bedeutet, werden wir anderen es tun. Also behalte keine Geheimnisse vor uns. – ajb

+0

Also habe ich gerade die Testmethode bearbeitet '@Test öffentliche void testDrawCard() { Deck deck = neues Deck(); assertThat (deck.getCards(). Length) .isEqualTo (98); für (int i = 0; i <98; i ++) { deck.drawCard(); } assertThat (deck.getCards(). Length) .isEqualTo (0); } ' Aber der Fehler ist immer noch ' java.lang.ArrayIndexOutOfBoundsException: 0 \t bei edu.hm.hafner.java2.thegame.Deck.drawCard (Deck.java:35) \t bei edu. hm.hafner.java2.thegame.DeckTest.testDrawCard (DeckTest.java:40) ' – Konstantin

Verwandte Themen