Согласно JLS, оценка времени выполнения выражения доступа к массиву ведет себя следующим образом:
- Сначала оценивается выражение ссылки на массив. Если эта оценка завершается преждевременно, то доступ к массиву завершается преждевременно по той же причине, и выражение индекса не оценивается.
- В противном случае вычисляется индексное выражение. Если эта оценка завершается преждевременно, то доступ к массиву завершается преждевременно по той же причине.
- В противном случае, если значение выражения ссылки на массив равно нулю, генерируется исключение NullPointerException.
Таким образом, этот код будет печатать: java.lang.NullPointerException, index = 2
class Test3 {
public static void main(String[] args) {
int index = 1;
try {
nada()[index = 2]++;
} catch (Exception e) {
System.out.println(e + ", index=" + index);
}
}
static int[] nada() {
return null;
}
}
Вопрос в том, по какой причине нам нужно сначала оценить выражение index = 2
а не просто выбросить исключение NullPointerException после того, как ссылка на массив будет оценена как нулевая? Или другими словами - почему порядок 1,2,3, а не 1,3,2?