Мои выходы печатают null
вместе с элементами, когда это не должно. Например,Метод Previous() класса ListIterator
MyList<String> l = new MyList<String>();
l.add("A");
l.add("B");
l.add("C");
l.add("D");
l.add("E");
ListIterator<String> iter = l.listIterator(l.size());
while(iter.hasPrevious()){
Object element = iter.previous();
System.out.print(element + " ");
}
И результат:
null E D C B A
Что случилось с методом предыдущего() и как я могу исправить, так что он не будет печатать null
?
protected Node<T> beginMarker; // Dummy node marking the front of the list
protected Node<T> endMarker; // Dummy node marking the back of the list
....................
public class AListIterator implements ListIterator<T>{
protected Node<T> current;
protected Node<T> lastVisited = null;
protected int expectedModCount = modCount;
public boolean hasPrevious(){
if(expectedModCount != modCount)
throw new ConcurrentModificationException();
return current != beginMarker;
}
public T previous(){
if(expectedModCount != modCount)
throw new ConcurrentModificationException();
if(!hasPrevious())
throw new RuntimeException("Already at beginning of list");
T prevItem = current.data;
current = current.prev;
return prevItem;
}
Я не думаю, что мы можем ответить, не видя весь класс списка. Мы не знаем, как инициализируется 'current', или есть ли что-то еще в коде, которое не позволяет правильно настроить список с двойной связью. – ajb
'current' в' предыдущем' метод сначала относится к * текущему * узлу, а не к предыдущему: поэтому 'prevItem' присваивается данные * текущего * узла. Я подозреваю, что 'l.listIterator (l.size() - 1);' сделает результат «правильным», хотя это не исправление и просто скрывает проблему. – user2864740
Учитывая приведенный код, 'previous()' должен вызывать 'NullPointerException', потому что' current' является 'null' в выражении' T prevItem = current.data; 'Если вы не получаете NPE там, вы должны быть инициализируя 'current', но делая это неправильно. Итак, показ этого кода важен. – erickson