LinkedList(Java)自身实现中的NPE

LinkedList(Java)自身实现中的NPE,java,linked-list,Java,Linked List,我是编程新手,我需要编写某种自己的LinkedList,但只能使用add(E element)方法和迭代器的hasNext()和next()。这是我的密码: public class LinkedArray<E> implements Iterator<E> { private int size = 0; private int current = 0; private Node<E> first;

我是编程新手,我需要编写某种自己的LinkedList,但只能使用
add(E element)
方法和迭代器的
hasNext()
next()
。这是我的密码:

  public class LinkedArray<E> implements Iterator<E> {

        private int size = 0;

        private int current = 0;

        private Node<E> first;

        private Node<E> last;

        private Objects[] objects = new Objects[10];

        public void add(E value) {
            Node<E> element = new Node<E>(last, value, null);
            if (last != null) {
                element.next = element;
            } else {
                first = element;
            }
            last = element;
            size++;
        }

        @Override
        public boolean hasNext() {
            boolean result = false;
            try {
                if (objects[current + 1] != null) {
                    result = true;
                }
            } catch (ArrayIndexOutOfBoundsException e) {
                result = false;
            }
            return result;
        }

        @Override
        public E next() {
            E result;
            try {
                current++;
                result = (get(current - 1));
            } catch (ArrayIndexOutOfBoundsException a) {
                throw new NoSuchElementException("No more elements in list.");
            }
            return result;
        }

   public E get(int position) throws NullPointerException {
        Object result;
    if (this.objects[position] != null) {
        result = this.objects[position];
    } else {
        throw new NullPointerException("Position is empty.");
    }
    return (E) result;
}


        private class Node<E> {

            private E element;

            private Node<E> next;

            private Node<E> prev;

            Node(Node<E> prev, E element, Node<E> next) {
                this.element = element;
                this.next = next;
                this.prev = prev;
            }
        }
    }
公共类LinkedArray实现迭代器{
私有整数大小=0;
专用int电流=0;
私有节点优先;
最后是私有节点;
私有对象[]对象=新对象[10];
公共无效添加(E值){
节点元素=新节点(最后一个,值,空);
if(last!=null){
element.next=元素;
}否则{
第一个=元素;
}
最后=元素;
大小++;
}
@凌驾
公共布尔hasNext(){
布尔结果=假;
试一试{
if(对象[当前+1]!=null){
结果=真;
}
}捕获(阵列索引边界外异常e){
结果=假;
}
返回结果;
}
@凌驾
公共教育{
E结果;
试一试{
电流++;
结果=(get(current-1));
}捕获(阵列索引边界外异常a){
抛出新的NoSuchElementException(“列表中没有更多元素”);
}
返回结果;
}
公共E get(int位置)抛出NullPointerException{
客观结果;
if(this.objects[position]!=null){
结果=此。对象[位置];
}否则{
抛出新的NullPointerException(“位置为空”);
}
返回(E)结果;
}
私有类节点{
私人电子元件;
私有节点下一步;
私有节点prev;
节点(上一个节点、E元素、下一个节点){
this.element=元素;
this.next=next;
this.prev=prev;
}
}
}
但是当我开始测试add(E值)

@测试
公开无效测试(){
LinkedArray arr=新LinkedArray();
String=“Test”;
arr.add(字符串);
字符串结果=arr.next();
资产(结果,即“测试”);
}
…我只得到一个错误。问题是,为什么我弄错了?

您的
get(…)
函数从
对象
数组中读取对象。 您从未设置此数组的内容,因此如果
位置
小于10,它将始终为
null
,并导致遇到NPE


看起来您已经修改了基于数组的列表,但只更改了
add
方法。所有其他方法都与空的
对象
数组交互。

您已经明确抛出了自己的NPE

public E get(int position) throws NullPointerException {
    Object result;
    if (this.objects[position] != null) {
        result = this.objects[position];
    } else {
        throw new NullPointerException("Position is empty.");
    }
    return (E) result;
}
如果你想跟随,Javadoc会这样说

抛出:
IndexOutOfBoundsException
-如果索引超出范围
(索引<0 | |索引>=size())

因此,因为您没有“引用”任何
null
,而只是在数组为空的情况下返回null,然后抛出另一个异常

public E get(int position) throws IndexOutOfBoundsException {
    if (position < 0 || position >= this.objects.length) {
        throw new IndexOutOfBoundsException();
    }
    return (E) this.objects[position];
}
public E get(int位置)抛出IndexOutOfBoundsException{
if(位置<0 | |位置>=this.objects.length){
抛出新的IndexOutOfBoundsException();
}
返回(E)此对象[位置];
}
注意:
Iterator
类通常没有
E get()
方法。只要
hasNext()
next()

因此,您不应该以
next()
需要调用
get()
的方式实现类


您也不需要在那里尝试catch。您已经知道使用if语句时
位置
超出范围。

发布错误(stacktrace)getting@hanumant它只是“java.lang.NullPointerException:Position为空。”在E get(int Position)方法中。然后,要么它没有被正确添加,要么你没有正确访问它请在@JFPicard调试它一次,我知道npe的意思,我不明白它为什么在这里
public E get(int position) throws IndexOutOfBoundsException {
    if (position < 0 || position >= this.objects.length) {
        throw new IndexOutOfBoundsException();
    }
    return (E) this.objects[position];
}