列表 - RemoveFirst获取NullPointerException

时间:2014-05-15 13:01:18

标签: java

我尝试使用列表删除列表的第一个节点并返回删除的值来执行removeFirst()。

以下是我所拥有的:

    public E removeFirst() {
        E value=first.val;

        first=first.next;
        size--;
        return value;
}
    public void addLast(E v) {
    last = new Node(v,last);
    size++;
}

其他课程:

class Cliente {
String nome;
int tchegada;
int np;

Cliente(String n, int tc, int p) {
    nome = n;
    tchegada = tc;
    np = p;
} 
}

清单:

    class List<E>  {
private int size;
private Node first;
private Node last;

public boolean isEmpty() {return (size == 0);}
public int size() {return size;}

// construtor de lista vazia
List() {
    size = 0;
    first = last = null;
}

// um no da lista
private class Node {
E val;
Node next;

Node(E v, Node n) {
    val = v;
    next = n;
}
}
(...)

主:

    class Prob106_v0 {

public static void main(String args[]) {
Scanner in = new Scanner(System.in);

// Read the flag
int flag   = in.nextInt();

// Read the boxes to an array
int n        = in.nextInt();
Caixa caixas[] = new Caixa[n];
for (int i=0; i<n; i++) {
    int k = in.nextInt();
    caixas[i] = new Caixa(k);
}

// Read the clients to a list of objects
int c = in.nextInt();
List<Cliente> clientes= new List<Cliente>();
for (int i=0; i<c; i++) {
    String nome       = in.next();
    int tempo_chegada = in.nextInt();
    int num_produtos  = in.nextInt();
    clientes.addLast(new Cliente(nome, tempo_chegada, num_produtos));       
}   

// Flag 0 - Remove each client and write the name of the one just removed
if(flag == 0) {     
    while(!clientes.isEmpty()) {
    Cliente cli = clientes.removeFirst();
    System.out.println(cli.nome);       
    }
} else {     
    // This doesn't matter, it's another part of the program I haven't finished.
    Subtarefas.resolve(flag, n, caixas, clientes);  
}
}

}

恢复,我应该删除列表中的第一个元素&#39; clientes&#39;并返回我刚删除的内容,在本例中为客户端名称(cliente.nome),直到没有要删除的内容(null)。

但我收到了NullPointException

    Exception in thread "main" java.lang.NullPointerException
at List.removeFirst(Prob106_v0.java:80)
at Prob106_v0.main(Prob106_v0.java:135)

编辑:当列表为空时,不会使用RemoveFirst。但我发现当大小为1时,会产生异常。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

如果您的列表只有一个元素,请使用此代码段:

  public E removeFirst() {
        E value=first.val;

        first=first.next;
        size--;
        }

        return value;
}

将导致NullPointException

 public E removeFirst() {
            E value=first.val;
           if (size>=2)
           {
           first=first.next;                            
           }
           else if (size==1)
           {
            last=null;
           }
            size--;                
            return value;
    }

答案 1 :(得分:0)

您需要确保列表中有某些内容,否则removeFirst()会爆炸

答案 2 :(得分:0)

这里的问题是first=first.next; 如果您的列表只有一个元素,则不会有下一个节点,因此为null。