2017-09-05 2 views
-1

Je travaille sur Java via le site web Codefights. C'est l'exercice:Erreur de tableaux Java (pas hors limites)

Après être devenus célèbres, CodeBots a décidé de déménager dans un nouveau bâtiment et de vivre ensemble. Le bâtiment est représenté par une matrice rectangulaire de chambres, chaque cellule contenant un nombre entier - le prix de la pièce. Certains chambres sont gratuits (leur coût est de 0), mais c'est probablement parce qu'ils sont hantés, donc tous les robots ont peur d'eux. C'est pourquoi toute pièce est libre ou se trouve n'importe où sous une pièce libre dans la même colonne est pas considéré comme approprié pour les robots. Aide les robots à calculer le prix total de toutes les chambres qui leur conviennent. Exemple: Pour

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

la sortie doit être matrixElementsSum(matrix) = 9. Voici les chambres matrice avec des chambres ne conviennent pas marqués 'x':

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

Ainsi, la réponse est 1 + 5 + 1 + 2 = 9.

Je comprends que je dois aller à travers tous les éléments du tableau, ce qui est facile. La partie sur laquelle je suis accroché vérifie les "0" pièces au-dessus de l'élément courant dans le tableau. Je sais que cette position sera la matrice [i-1] [j], où la position actuelle dans le tableau est la matrice [i] [j]. Mais, j'obtiens une erreur "InvocationTargetExeption" quand j'essaye d'implémenter ceci. Mon hypothèse est que je demande des nombres négatifs dans l'adresse du tableau, mais je ne suis pas sûr de savoir comment résoudre ce problème. Voici mon 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

Il pourrait encore être un AIOOBE. Vous devez vérifier le reste de la pile (et le publier ici). –

+1

Vous avez je commence à 0, et vous utilisez i-1 dans votre déclaration if, donc quand i = 0, vous appelez matrix [-1] – Tyler

+0

Avec i == 0 vous essayez d'accéder 'matrice [-1]' dans l'instruction if menant à l'exception. Comment invoquez-vous ce code? Il semble qu'il y ait un cadre autour de cela. L'exception devrait continuer avec "Caused by" et tôt ou tard, il devrait y avoir une ArrayIndexOutOfBoundsException ou quelque chose de similaire – Lothar

Répondre

0

Il est un ArrayIndexOutOfBoundsException et vous pouvez le réparer en remplaçant:

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

avec:

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

Vous obtenez parce que vous êtes en essayant d'accéder: matrix[i-1][j] et quand i = 0 alors i-1 = -1 ...

L'exécution du code fixe sur la matrice dans l'exemple fourni a renvoyé 9 comme prévu.

La seule raison pour laquelle je peux penser, que vous voyez un InvocationTargetException est si vous invoquez matrixElementsSum utilisant la réflexion: alors la méthode renvoie une ArrayIndexOutOfBoundsException qui est enveloppé par InvocationTargetException.

De Method.java docstring:

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

Oh, sympa!L'instruction et signifie que si i est négatif, la matrice n'est même pas référencée si l'adresse est négative, donc pas d'exception. J'apprécie l'aide, mais maintenant que faisons-nous sur le fait que nous devons également évaluer la pièce au-dessus de la pièce ci-dessus. Cela signifierait que la même exception serait levée si je n'étais que 1, puisque 1 - 2 est toujours négatif. –

+0

Je pense à une autre instruction if, en utilisant i> 1 et [i-2] imbriqué dans le premier if? –

+1

J'apprécie l'aide à nouveau. La seconde instruction if a fonctionné. Un argument avec Codefights est que vous ne pouvez pas voir de solutions jusqu'à ce que vous ayez à traverser le problème. Je suppose qu'il y a une logique à cela, mais parfois je me demande si rester coincé n'est pas moins productif que de voir une bonne réponse et de la digérer avant de continuer. D'un autre côté, la pratique de la recherche peut parfois être aussi utile que le codage de la pratique. Merci a tous! o7 –