NullPointerException使用链接列表时出错
我刚刚完成了这个程序的工作,并将其编译,但在用户输入后它会中断并给我这个:
请在键盘12 4 3 2 1输入0或更多值
Exception in thread "main" java.lang.NullPointerException at Search.buildList(Search.java:41) at Search.main(Search.java:10)
这是代码:
import java.io.*; import java.util.*; public class Search { public static void main(String argv[]) throws IOException { Scanner stdin = new Scanner(System.in); System.out.println("Please input 0 or more values at keyboard"); Node head = buildList(); System.out.println("Now printing list"); printList(head); System.out.println("\nWhat key in list are you searching for? "); int key = stdin.nextInt(); System.out.print("Your key was "); if (search(head, key)) System.out.println("found."); else System.out.println("not found."); } private static void printList(Node head) { if (head != null) { System.out.print(head.getItem() + " "); printList(head.getNext()); } } private static Node buildList() throws IOException { // Post : Inserts 0 or more numerical values from keyboard into list // using the Scanner class and returns head of list Scanner input = new Scanner(System.in); Node head = null; Node first = new Node(input.nextInt()); head.setNext(first); while(input.hasNext()) { insert(first, input.nextInt()); /* Node curr = new Node(input.nextInt()); Node prev = head; while (true) { prev = prev.getNext(); if ((int)curr.getItem() 0; prev = curr, curr = curr.getNext() ) {} Node newNode = new Node(newValue, curr); if (prev != null) { prev.setNext(newNode); return head; } else return newNode; } private static boolean search(Node head, Comparable key) { // PRE: head points to the front of linked list; list may be // empty or non-empty; key is item searching for // POST: returns true or false regarding whether key is found in // list if (head == null){ return false;} else if (head.getItem().equals(key)){ return true;} else { return search(head.getNext(), key); } } }
有任何想法吗?
输出应类似于以下内容:
请在键盘输入0或更多值
12 4 -1 5 3 0 2
现在打印清单
-1 0 2 3 4 5 12你在找什么钥匙? 15找不到你的钥匙
Node head = null;
无论何时在null对象上调用方法,都会得到nullPointerException。这就是为什么head.setNext(first);
给你例外。 所以你可以这样做而不是这个
Node head = new Node();
你会避免使用NullPointerException。
根据您的要求,您应该这样做。
private static Node buildList() throws IOException { // Post : Inserts 0 or more numerical values from keyboard into list // using the Scanner class and returns head of list Scanner input = new Scanner(System.in); Node head = null; Node first = new Node(input.nextInt()); head=first; //assigning the first value to head while(input.hasNext()) { insert(first, input.nextInt()); head.setNext(first);//insert the node in the list } return first; }
注意:我假设setNext()在列表中的适当位置插入节点而不是直接插入头节点的下一个位置(否则无论插入多少个数字,都只能获得2个节点)
Node head = null;
上面的行将使作为Node
类型的object reference variable
的head变为nul
l,现在调用此对象引用变量的任何方法都将导致NullPointerException
。
Node head = new Node();
该行将是一种更好的方法,因为这将防止 NullPointerException
。