【问题标题】:NullPointer Exception in LinkedList [closed]LinkedList 中的 NullPointer 异常
【发布时间】:2014-01-31 00:39:37
【问题描述】:

这只是一个愚蠢的问题, 为什么我在删除元素时会出现异常... 我刚刚在我的同学那里看到了这段代码,当我运行代码并选择删除时,我得到了 NULLPOINTEREXCEPTION

顺便说一下代码....(我得到错误的地方)

                 if(!(head.data).equals(del)) 
                 {
                     tail=head;   
                     Node temp=head.next;
                     while(temp!=null)
                     {
                         if((temp.data).equals(del))
                         {
                             tail.next=temp.next;
                             size--;
                             break;
                         }
                         tail=temp;
                         temp=temp.next;
                     }
                 }
                 else
                 {
                     head=head.next;
                 }   
                 }
                else 
                {
                    System.out.println("LinkedList is empty"); 
                }
                break;

如果有人能帮我解决这个问题,我很高兴....

完整代码。 导入java.io.*; 导入 java.util.LinkedList;

public class Main 
{
public static void main(String[]args) throws Exception
{
    BufferedReader x = new BufferedReader(new InputStreamReader(System.in));

    LinkedList<String> list = new LinkedList<>();
    list.add("Jarn");
    list.add("Zhai");
    System.out.println("List:..");
    //System.out.println();
    System.out.println(list);
    System.out.println();

    String ch,in,fi,del;
    boolean kita = false;
    int size=0,data;   
    Node head=null, tail=head; 

    do
    {
        System.out.println("Choose Option.\n1-Insert\n2-Delete\n3-Dispay\n4-Find\n5-Quit");
        System.out.println();
        System.out.println("Choice: ");
        ch=x.readLine();
        System.out.println();
        switch (ch) 
        {
            case "1":
                System.out.println("Enter Name you Want to Insert..");
                in=x.readLine();
                list.addLast(in);
                System.out.println("Name "+in+" was successfully inserted..");
                System.out.println();
                break;
            case "2":
                if(size>=0)
                {  
                 System.out.println("Enter name to del..");  
                 del=x.readLine();

                 if(!(head.data).equals(del)) 
                 {
                     tail=head;   
                     Node temp=head.next;
                     while(temp!=null)
                     {
                         if((temp.data).equals(del))
                         {
                             tail.next=temp.next;
                             size--;
                             break;
                         }
                         tail=temp;
                         temp=temp.next;
                     }
                 }
                 else
                 {
                     head=head.next;
                 }   
                 }
                else 
                {
                    System.out.println("LinkedList is empty"); 
                }
                break;
            case "3":
                System.out.println("List..");
                System.out.println();
                System.out.println(list);
                break;
            case "4":
                System.out.println("Enter name You Want to Find..");
                fi=x.readLine();
                while(size!=(list.size()))
                {
                    String temp = list.get(size);
                    if(temp.equalsIgnoreCase(fi))
                    {
                        kita=true;
                    }
                    size++;
                }
                if(kita)
                {
                    System.out.println("Name: "+fi+" exists!.");
                    System.out.println();
                }
                else
                    {
                        System.out.println("Name: "+fi+" not found!.");
                        System.out.println();
                    }
                break;
            case "5":
                System.out.println("Thank You..");
                break;
            default:
                System.out.println("INVALID OPTION..");
                System.out.println();
                break;
        }
    }
    while(!ch.equals("5"));
}
    class Node  
 {  
  String data;   
  Node next;   
  Node(String d)// node class Constructor.   
  {  
        data = d;   
       next= null;   
  }  

}

}

【问题讨论】:

  • 你能发布错误stack trace吗?
  • Main.main(Main.java:45) Java 结果中的线程“main”java.lang.NullPointerException 异常:1
  • 请使用完整的堆栈跟踪编辑您的问题。还用行表示数字45
  • if(!(head.data).equals(del)) { tail=head;节点 temp=head.next; while(temp!=null) {
  • 最后一次编辑没有改善您的帖子。您删除了所有初始化。我想问题在于,当您阅读它们时,headdelhead.datanull。您是否尝试过使用调试器?

标签: java nullpointerexception linked-list nodes singly-linked-list


【解决方案1】:

在删除之前你需要找到要删除的元素。 使用 while 循环。

while(current.data!=n)

        {

         prev=current;

         current=current.link;

        }  

【讨论】:

  • 也许如果 OP 使用自己的节点结构,并编写了自定义链表实现,是的。但是,由于他们使用的是普通的 LinkedList,因此使用 remove() 是合适的方法。
【解决方案2】:

感觉就像您正在尝试将自定义链表与 Java 集合框架中的 LinkedList 混合。这可能会让您感到困惑。

事实证明,List 指定了一个 remove(Object o) 函数,可以让您更直接地大量删除内容。

这会将你的 delete function case 语句变成:

System.out.println("Enter name to del..");  
String del=x.readLine();
boolean removed = list.remove(del);
if(removed) {
    System.out.println(del + " was removed successfully.");
} else {
    System.out.println(del + " isn't in the list!");
}

...从那里,您可以完全忘记整个自定义 Node 业务。它没有添加任何东西。

请注意:del 在您的原始代码中未定义为有效变量,您不太可能再次需要它。它可以内联,但我觉得这更好地说明了句法流程。

诚然,强烈感觉这是一项旨在让您设计自己的自己的链表结构的作业,但我会三重检查作业并与您的教授/助教一起检查。

【讨论】:

  • 我刚想问他,使用java的LinkedList并创建一个自制的remove的目的是什么,我认为这个问题已经得到了正确的回答,因此它是我的+1。
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多