Мне что-то не хватает очень просто потому, что это дует мне на ум!Программа, бросающая исключение после проверки исключения
Я пытаюсь реализовать кучу, используя CompleteBinaryTree (который реализован с использованием массива). Этот CompleteBinaryTree представляет собой массив из Position<T>
, где каждый элемент Position
содержит элемент. Я пишу метод add(T t)
для кучи, где t
вставляется в следующую свободную позицию CompleteBinaryTree, а затем процесс перебора выполняется до тех пор, пока не будет заказано CompleteBinaryTree. Вот метод:
private CompleteBinaryTree<T> tree = new CompleteBinaryTree<T>();
private Position<T> entry = null;
public void add(T t) {
entry = tree.add(t);
if (entry.equals(tree.root())) {
return;
}
//continue to swap inserted element with its parent
//while it is smaller than its parent
while (entry.element().compareTo(tree.parent(entry).element()) < 0) {
Position<T> parent = tree.parent(entry);
Position<T> temp = entry;
entry = parent;
parent = temp;
}
}
Первый элемент добавляется штраф в Heap, но когда я пытаюсь добавить второй элемент, InvalidPositionException
выбрасывается на while()
линии. Это где Exeption выбрасывают внутри класса CompleteBinaryTree:
public Position<T> parent(Position<T> p) {
if (p == root()) throw new InvalidPositionException();
return array[((ArrayPosition) p).index/2];
}
А вот две другие методы, используемые в CompleteBinaryTree
:
public Position<T> root() {
if (isEmpty()) throw new InvalidPositionException();
return array[1];
}
public Position<T> add(T t) {
if (last == array.length) {
// extend array
ArrayPosition[] temp = (ArrayPosition[]) new Object[array.length*2];
for (int i=1; i < array.length; i++) {
temp[i] = array[i];
}
array = temp;
}
array[last] = new ArrayPosition(last, t);
return array[last++];
}
Как я получаю исключение брошено из-за p == root()
года, когда Сначала я проверяю, является ли p корнем?
EDIT
Вот CompleteBinaryTree toString()
, который возвращается Кучи toString()
:
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i = 1; i < last; i++) {
buf.append(" ").append(array[i]);
}
return buf.toString();
}
'root()', вероятно, бросает. – SLaks
, но до того, как будет выбрано исключение, метод возвращает, если 'entry' является корнем, но затем генерируется исключение, потому что' entry' является корнем? – KOB
Вы отлаживали? Исключение было поднято на 'if (p == root())' или 'if (isEmpty())', лучше, если вы переместите 'throw new InvalidPositionException();' в новую строку –