2017-01-05 1 views
1
public class GameEntry { 
    private String name; 
    private int score; 

    public GameEntry(String n, int s){ 
     name = n; 
     score = s; 
    } 
    public String getName(){ 
     return name; 
    } 
    public int getScore(){ 
     return score; 
    } 
    public String toString(){ 
     return "(" + name + ", "+ score + ")"; 
    } 
} 

public class Scoreboard { 
    private int numEntries = 0; 
    public GameEntry[] board; 

    public Scoreboard(int capacity){ 
     board = new GameEntry[capacity]; 
    } 
    **public void add(GameEntry e){** 
     //System.out.println(board[numEntries - 1].getScore()); 
     int newScore = e.getScore(); 
     //Is the new entry really a high score 


//*****This is the line i refer to as****** 
     if (numEntries < board.length || newScore > board[numEntries - 1].getScore()) { 
      if (numEntries<board.length) { 
       numEntries++; 
      } 
      //shift any lower scores rightward to make room for the new entry 
      int j = numEntries - 1; 
      while(j>0 && board[j-1].getScore()<newScore){ 
       board[j] = board[j-1]; //shift entry from j-1 to j 
       j--; // and decrement j 
      } 
      board[j] = e; // when done add a new entry 
     } 
    } 
} 

Je voudrais attirer votre attention à l'intérieur de la classe Scoreboard, à sa méthode add . Ma question est pourquoi ce code ne manque pas.Java Array! Hors des limites

La première fois que la méthode add s'exécute, numEntries est égal à 0. Ainsi, dans l'instruction if, le tableau [numEntries - 1] .getScore doit obtenir un IndexOutOfBounds.

Lorsque je le mets avant le si je reçois la bonne exception. Est-ce que le si attrape l'exception?

J'ai imprimé la valeur de (numEntries - 1) et j'obtiens -1. Mais encore à l'intérieur du si ne semble pas le déranger.

La ligne à laquelle je me réfère est à l'intérieur de la méthode add le premier if.

if (numEntries < board.length || newScore > board[numEntries - 1].getScore()) 
+0

Lors de la première initialisation du tableau de bord, la table [numEntries - 1] n'existe toujours pas. Ce qui signifie, assurez-vous que votre tableau a des éléments avant d'essayer d'y accéder. –

+0

numEntries

+0

@ChakradharVyza C'est un opérateur OU, pas un ET. Donc, si la première condition est fausse, la seconde est vérifiée et PAS ignorée. –

Répondre

4

Réponse simple: évaluation de court-circuit de logique ou.

Lorsque la première partie de la condition, c'est-à-dire numEntries < board.length, est évaluée à true, la seconde partie après || n'est pas évaluée du tout.

+0

Ok je ne savais pas ça. Merci – panoskarajohn

+0

Un usage très commun du même mécanisme est comme ça: 'if (foo! = Null && foo.bar())' - il ne provoque pas de 'NullPointerException' pour' foo == null' car le côté droit de '&&' n'est pas évalué quand le côté gauche évalue à 'false' –

+0

Il est logique d'opter pour le && aussi. – panoskarajohn

1

Vous regardez l'expression suivante première:

numEntries < board.length 

Ensuite, vous avez un OU (||) suivi de l'expression que vous demandez au sujet.

Le compilateur vérifie l'expression de gauche à droite. Donc, si l'expression ci-dessus est vraie, elle entre simplement dans l'if et commence à exécuter son contenu sans vérifier les autres expressions.