Eccezione nel thread “main” java.util.NoSuchElementException: nessuna riga trovata – Utilizzo dello scanner input

Sto cercando di eliminare un nodo specifico da un elenco collegato. Sto cercando di chiamare il mio metodo removeNode, ma mi sta dando questo errore quando lo chiamo per ottenere l’input dell’utente. Qualche consiglio su come risolvere questo problema sarebbe molto apprezzato!

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) 

Classe 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 } } 

class 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 

    Il problema è che stai chiudendo System.in ( Scanner.close() chiude il stream sottostante ). Una volta che lo fai, rimane chiuso, e non è disponibile per l’input. Normalmente non vuoi farlo con l’input standard:

     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! 

    Inoltre, per riferimento futuro, dovresti provare a creare casi di test più minimali. Ti aiuterà a eseguire il debug e anche a rimuovere un sacco di rumore dalle tue domande. 🙂

    Come per risolvere java.util.NoSuchElementException in Java (oltre al buon senso) utilizzare il tipo appropriato di hasNext metodo prima di ogni next .

    Nel tuo caso particolare, sarà qualcosa del genere:

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