2017-01-05 4 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 
     } 
    } 
} 

Я хотел бы обратить ваше внимание внутри класса Scoreboard, его добавить метод.Java Array! Нет! Out Of Bounds

Мой вопрос: почему этот код не подводит.

При первом запуске метода add numEntries равен 0. Таким образом, внутри оператора if плата [numEntries-1] .getScore должна получить IndexOutOfBounds.

Когда я поставил его перед тем, если я получу правильное исключение. Вызывает ли исключение исключение?

Я напечатал значение (numEntries - 1), и я получаю -1. Но все же внутри if, похоже, это не беспокоит.

Линия, о которой я говорю, находится внутри метода добавления, если первый.

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

Когда вы впервые инициализируете массив доски, плата [numEntries-1] все еще не существует. Смысл, убедитесь, что ваш массив имеет элементы, прежде чем пытаться получить к ним доступ. –

+0

numEntries

+0

@ChakradharVyza Это оператор OR, а не AND. Поэтому, если первое условие ложно, второе получает проверку и НЕ игнорируется. –

ответ

4

Простой Ответ: Оценка короткого замыкания логической или.

Когда первая часть условия, т.е. numEntries < board.length вычисляется в true, вторая часть после того, как || не вычисляется вообще.

+0

Хорошо, я этого не знал. Спасибо – panoskarajohn

+0

Очень распространенное использование того же механизма: 'if (foo! = Null && foo.bar())' - он не вызывает 'NullPointerException' для' foo == null', потому что правая сторона '&&' не оценивается, когда левая сторона оценивает значение 'false' –

+0

Имеет смысл пойти и для &&. – panoskarajohn

1

Вы первый проверить следующее выражение:

numEntries < board.length 

Тогда у вас есть OR (||), а затем с помощью выражения вы спрашиваете.

Компилятор проверяет выражение слева направо. Поэтому, если указанное выше выражение истинно, оно просто вводит if и запускает его содержимое без проверки других выражений.