线程“main”中的exceptionjava.util.NoSuchElementException:找不到行 – 使用scanner输入

我试图从链表中删除特定节点。 我试图调用我的方法removeNode,但是当我调用它来获取用户输入时它给了我这个错误。 任何关于如何解决这个问题的建议将不胜感激!

Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Unknown Source) at LinkedList.removeNode(LinkedList.java:123) at fileIn.(fileIn.java:22) at fileIn.main(fileIn.java:13) 

LinkedList类:

 import java.util.Scanner; public class LinkedList { public LinkedListNode front; public LinkedList() { this.front = null; } public void insertBack(String data) { if(front == null){ front = new LinkedListNode(data); } else{ LinkedListNode newNode = new LinkedListNode(data); LinkedListNode current = front; while(current.getNext() != null){ current = current.getNext(); } current.setNext(newNode); } }//end insertBack public void addAfter(LinkedListNode spot, String data) { LinkedListNode newNode; newNode = new LinkedListNode(data); newNode.next = spot.next; spot.next = newNode; }//end addAfter public void addBefore(LinkedListNode spot, String data) { }//end addBefore public void deleteAfter(LinkedListNode spot) { LinkedListNode nextNode; nextNode = spot.next; spot.next = nextNode.next; }//end deleteAfter public String showList() { sortList(); //^-- Will sort the sum but not the nodes int i = 0; String retStr = "The nodes in the list are:\n"; LinkedListNode current = front; while(current != null){ i++; retStr += "Node " + i + " is: " + current.getData() + " and the sum is: " + current.getSum() + "\n"; current = current.getNext(); } return retStr; } public LinkedListNode findTail() { LinkedListNode current = front; while(current.getNext() != null){ current = current.getNext(); } return current; }//end findTail public LinkedList sortList() { LinkedListNode current = front; LinkedListNode tail = null; while(current != null && tail != front ) { LinkedListNode next = current; for( ; next.next != tail; next = next.next) { if(next.sum >= next.next.sum) { long temp = next.sum; String temp2 = next.data; next.sum = next.next.sum; next.data = next.next.data; next.next.sum = temp; next.next.data = temp2; } } tail = next; current = front; } return this; } public void removeNode(){ String searchedNode; Scanner in = new Scanner(System.in); System.out.println("Enter the name you would like to remove from the list: "); searchedNode = in.nextLine(); in.close(); LinkedListNode previous = null; LinkedListNode current = front; //while there is something in the list nodes while (current != null) { //if the data of current is equal to the node being searched if(current.data.equals(searchedNode)) { //set current to the node after current current = current.next; //if previous is equal to null(which it is) if (previous == null) { //set previous equal to current previous = current; } else previous.next = current; } else { previous = current; current = current.next; } } //end while } } 

fileIn类:

 import java.util.Scanner; import java.io.*; public class fileIn { LinkedListNode front; LinkedList myList = new LinkedList(); String fname; public static void main(String[] args) { fileIn f = new fileIn(); }//end main public fileIn() { getFileName(); readFileContents(); System.out.print(myList.showList()); myList.removeNode(); }//end fileIn public void readFileContents() { boolean looping; DataInputStream in; String line; /* Read input from file and process. */ try { in = new DataInputStream(new FileInputStream(fname)); looping = true; while(looping) { /* Get a line of input from the file. */ if (null == (line = in.readLine())) { looping = false; /* Close and free up system resource. */ in.close(); }//end if else { myList.insertBack(line); }//end else } /* End while. */ } /* End try. */ catch(IOException e) { System.out.println("Error " + e); } /* End catch. */ }//end readFileContents public void getFileName() { Scanner in = new Scanner(System.in); System.out.println("Enter file name please."); fname = in.nextLine(); in.close(); }//end getFileName }//end class fileIn 

问题是你正在关闭System.inScanner.close() 关闭底层流 )。 一旦这样做,它就会保持关闭状态,并且无法输入。 您通常不希望使用标准输入执行此操作:

 String searchedNode; Scanner in = new Scanner(System.in); System.out.println("Enter the name you would like to remove from the list: "); searchedNode = in.nextLine(); // in.close(); // <-- don't close standard input! 

此外,为了将来参考,您应该尝试创建更多的最小测试用例。 它将帮助您调试并从您的问题中消除大量噪音。 🙂

根据如何解决Java中的java.util.NoSuchElementException (以及常识)在每个next之前使用适当类型的hasNext方法。

在您的特定情况下,它将是这样的:

 if (in.hasNextLine) { in.nextLine(); }