Не рекомендуется использовать исключения для этой цели. Но если вы настаиваете, вы можете сделать это следующим образом. Во-первых, определить метод
public boolean isAlive(int x,int y) {
try {
return this.generation[x][y].isIsAlive() ;
} catch(IndexOutOfBoundsException ex) {
return false ; // Or whatever you want to be the default
}
}
И затем использовать isAlive(x+1,y+1)
вместо generation[x+1][y+1].isIsAlive()
и так далее.
Кроме того, создается впечатление, что вы ошибочно объявляете локальную переменную int neighbors = 0;
. Я говорю это, потому что вы продолжаете устанавливать его в 0
в конце, но вы его нигде не храните. Лично я хотел бы определить поле neighbors
в какой бы это базовый класс generation
и:
for(int x= 0 ; x < generation.length ; x++) {
for(int y= 0 ; y < generation[x].length ; y++) {
generation[x][y].neighbors= 0 ;
for(int dx= -1 ; dx <= 1 ; dx++) {
for(int dy= -1 ; dy <= 1 ; dy++) {
if(! (dx == 0 && dy == 0) && isAlive(x+dx,y+dx)) {
generation[x][y].neighbors++;
}
}
}
}
Меня беспокоит так много if
с 3 являются: 1. Это очень легко сделать ошибку. 2. Для добавления любого другого кода во все if
s потребуется много времени (и подвержено ошибкам). 3. Логику легче понять. Хотя вы также можете добавить комментарий, объясняющий, что вы собираетесь проверять соседей, и что соседи - это все 8 ячеек, где строка или столбец равна +1 или -1 текущей ячейке.
Кроме того, теперь, когда мы сократили число if
с, мы могли бы также встраивать функцию выше и написать следующее:
for(int x= 0 ; x < generation.length ; x++) {
for(int y= 0 ; y < generation[x].length ; y++) {
generation[x][y].neighbors= 0 ;
for(int dx= -1 ; dx <= 1 ; dx++) {
for(int dy= -1 ; dy <= 1 ; dy++) {
try {
if(! (dx == 0 && dy == 0) && isAlive(x+dx,y+dx)) {
generation[x][y].neighbors++;
}
} catch(IndexOutOfBoundsException ex) {
// Do whatever you want in this case
}
}
}
}
}
Теперь без злоупотребляющих исключений (который на сегодняшний день является наиболее рекомендуется), я бы сказал, что добавить функцию
public boolean isValidNeighbor(int i,int j) {
return 0 <= i && i < generation.length && 0 <= j && j < generation[i].length ;
}
И ваш код становится:
for(int x= 0 ; x < generation.length ; x++) {
for(int y= 0 ; y < generation[x].length ; y++) {
generation[x][y].neighbors= 0 ;
for(int dx= -1 ; dx <= 1 ; dx++) {
for(int dy= -1 ; dy <= 1 ; dy++) {
if(! (dx == 0 && dy == 0) && isValidNeighbor(x+dx,y+dx) && isAlive(x+dx,y+dx)) {
generation[x][y].neighbors++;
}
}
}
}
}
Многое, намного лучше. И, даже если не главная причина, меньше кода и сложности, чем с исключениями !!!
Ответ: не надо. Не используйте исключения для исключительного потока управления. –
Это аналогичный поток кода через вопрос ожидания: http: // stackoverflow.com/questions/16320014/java-optimization-nitpick-is-it-faster-to-cast-something-and-let-it-throw-excep/16320082 # 16320082 В дополнение к обычным проблемам чтения я сделал несколько тестов относительно эффективность. Это делает для мрачного чтения. «Слишком долго не читал» исключения были в 20 раз медленнее, чем экземпляр (который сам по себе довольно медленный) –
Об общих советах; использование «9» - магическое число; **Плохо**. Что делать, если размер массива изменяется, используйте array.length. вы можете получить второе измерение с помощью массива [0] .length. –