LinkedList(Java)自身实现中的NPE
我是编程新手,我需要编写某种自己的LinkedList,但只能使用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;
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];
}