Следующая программа генерирует гистограмму чисел по модулю 3. Что она напечатает?
int[] histogram = new int[3];
int value = Integer.MIN_VALUE;
do {
int index = Math.abs(value) % 3;
histogram[index]++;
} while (value++ != Integer.MAX_VALUE);
for (int i = 0; i < 3; i++) {
System.out.println(histogram[i]);
}
Считай - не считай... Но эта программа сгенерирует исключение ArrayIndexOutOfBoundsException: -2
Проблема в том, что метод Math.abs возвращает неотрицательное число всегда, кроме одного случая когда аргумент равен Integer.MIN_VALUE. В этом случае результат тоже равен Integer.MIN_VALUE. А при получении остатка от деления отрицательного числа получается отрицательный остаток. А ведь мы используем его в качестве индекса массива...
пятница, 23 ноября 2007 г.
Java Puzzle 63: More of the Same
В этой задаче приводится программа, аналогичная предыдущей, но вместо IdentityHashMap используется HashMap:
public class MoreNames {
private Map map = new HashMap();
public void MoreNames() {
this.map.put("Mickey","Mouse");
this.map.put("Mickey","Mantle");
}
public int size() {
this.map.size();
}
public static void main(String[] args) {
MoreNames map = new MoreNames();
System.out.println(map.size());
}
}
Ну почему он возвращает 0? А потому, что первый метод не является конструктором. Случайно добавив возвращаемый тип к декларации конструктора можно долго искать эту ошибку. Аккуратнее! ;)
public class MoreNames {
private Map map = new HashMap();
public void MoreNames() {
this.map.put("Mickey","Mouse");
this.map.put("Mickey","Mantle");
}
public int size() {
this.map.size();
}
public static void main(String[] args) {
MoreNames map = new MoreNames();
System.out.println(map.size());
}
}
Ну почему он возвращает 0? А потому, что первый метод не является конструктором. Случайно добавив возвращаемый тип к декларации конструктора можно долго искать эту ошибку. Аккуратнее! ;)
Подписаться на:
Сообщения (Atom)