问题
I am trying to delete a specific node from a linked list. I am trying to call my method removeNode, but it is giving me this error when I call it to get the user input. Any advice on how to fix this would be greatly appreciated!
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.<init>(fileIn.java:22)
at fileIn.main(fileIn.java:13)
LinkedList class:
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 class:
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
回答1:
The problem is you are closing System.in
(Scanner.close()
closes the underlying stream). Once you do that, it stays closed, and is unavailable for input. You don't normally want to do that with standard input:
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!
Also, for future reference, you should try to create more minimal test cases. It will help you debug and also remove a lot of noise from your questions. :-)
回答2:
As per How to solve java.util.NoSuchElementException in Java (as well as common sense) use the appropriate kind of hasNext
method before each next
.
In your particular case, it will be something like this:
if (in.hasNextLine) {
in.nextLine();
}
来源:https://stackoverflow.com/questions/19828015/exception-in-thread-main-java-util-nosuchelementexception-no-line-found-usi