2017-09-05 4 views
-1

Ich arbeite an Java über die Codefights-Website. Dies ist die Übung:Java-Arrays Fehler (nicht außerhalb der Grenzen)

Nachdem CodeBots Berühmtheit erlangt hatten, beschlossen sie, in ein neues Gebäude umzuziehen und zusammenzuleben. Das Gebäude wird durch eine rechteckige Matrix von Räumen dargestellt, wobei jede Zelle eine Ganzzahl enthält - der Preis des Raumes. Einige Zimmer sind frei (ihre Kosten sind 0), aber das ist wahrscheinlich, weil sie haunted sind, so dass alle Bots Angst vor ihnen haben. Deshalb ist jeder Raum, der frei ist oder sich irgendwo unter einem freien Raum in derselben Spalte befindet, nicht als für die Bots geeignet angesehen. Helfen Sie den Bots, den Gesamtpreis aller Zimmer zu berechnen, die für sie geeignet sind. Beispiel: Für

matrix = [[0, 1, 1, 2], 
      [0, 5, 0, 0], 
      [2, 0, 3, 3]] 

sollte die Ausgabe matrixElementsSum(matrix) = 9 sein. Hier ist die Zimmer-Matrix mit ungeeigneten Räumen die mit 'x':

[[x, 1, 1, 2], 
[x, 5, x, x], 
[x, x, x, x]] 

So lautet die Antwort 1 + 5 + 1 + 2 = 9.

Ich verstehe, dass ich muss gehen durch alle Elemente des Arrays, das ist einfach. Der Teil, an dem ich aufgehängt bin, überprüft die "0" -Räume über dem aktuellen Element im Array. Ich weiß, dass diese Position matrix [i-1] [j] ist, wobei die aktuelle Position in der Matrix die Matrix [i] [j] ist. Aber ich bekomme einen Fehler "InvocationTargetExeption", wenn ich versuche, dies zu implementieren.

Meine Annahme ist, dass ich nach negativen Zahlen in der Array-Adresse frage, aber ich bin mir nicht sicher, wie das zu beheben ist. Hier ist mein Code:

int matrixElementsSum(int[][] matrix) { 
    int sum = 0; 
    for(int i = 0; i < matrix.length; i++){ 
     for(int j = 0; j < matrix[i].length; j++){ 
      if(matrix[i-1][j]==0){ sum += 0;} 
      else{sum += matrix[i][j];} 
       } 
     } 
    return sum; 
} 
+2

Es ist immer noch ein AIOOBE sein könnte. Sie müssen den Rest des StackTrace überprüfen (und hier veröffentlichen). –

+1

Sie haben ich bei 0 beginnen, und Sie verwenden i-1 in Ihrer if-Anweisung, also wenn i = 0, rufen Sie Matrix [-1] – Tyler

+0

Mit i == 0 versuchen Sie, Zugriff auf Matrix [-1] ' in der if-Anweisung, die zu der Ausnahme führt. Wie rufen Sie diesen Code auf? Es scheint, als gäbe es einen Rahmen dafür. Die Ausnahme sollte mit "Caused by" fortgesetzt werden und früher als später sollte es eine ArrayIndexOutOfBoundsException oder etwas ähnliches geben – Lothar

Antwort

0

Es ist ein ArrayIndexOutOfBoundsException und man kann es beheben, indem Sie ersetzen:

if(matrix[i-1][j]==0){ sum += 0;} 

mit:

if(i > 0 && matrix[i-1][j]==0){ sum += 0;} 

Sie bekommen es, weil du bist Zugriff versuchen: matrix[i-1][j] und wenn i = 0 dann i-1 = -1 ...

Das Ausführen des festen Codes in der Matrix in dem von Ihnen bereitgestellten Beispiel ergab 9 wie erwartet.

Der einzige Grund, warum ich mir vorstellen kann, dass Sie eine InvocationTargetException sind zu sehen ist, wenn man matrixElementsSum mit Reflexion aufrufen: dann wirft die Methode eine ArrayIndexOutOfBoundsException, die von InvocationTargetException gewickelt ist.

Von Method.java docstring:

* @exception InvocationTargetException if the underlying method 
*    throws an exception. 
+0

Oh, schön!Die Anweisung und bedeutet, dass, wenn i negativ ist, die Matrix nicht einmal referenziert wird, wenn die Adresse negativ wäre, also keine Ausnahme. Ich schätze die Hilfe, aber was machen wir nun damit, dass wir auch den Raum oberhalb des Raumes beurteilen müssen. Das würde bedeuten, dass die gleiche Ausnahme ausgelöst würde, wenn ich nur 1 wäre, da 1 - 2 immer noch negativ ist. –

+0

Ich denke eine andere if-Anweisung, mit i> 1 und [i-2] innerhalb der ersten if verschachtelt? –

+1

Ich schätze die Hilfe wieder. Die zweite if-Anweisung funktionierte. Ein Problem mit Codefights ist, dass Sie keine Lösungen sehen können, bis Sie das Problem überwunden haben. Ich nehme an, dass es eine Logik darin gibt, aber manchmal frage ich mich, ob es nicht weniger produktiv ist, stecken zu bleiben, als eine gute Antwort zu sehen und sie zu verdauen, bevor ich weitermache. Auf der anderen Seite kann manchmal die Praxis, die Sie bei der Forschung bekommen, so wertvoll sein wie die Praxiscodierung. Danke, alles! o7 –

Verwandte Themen