线程“main”中的异常 java.util.NoSuchElementException: No line found - 使用扫描仪输入

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19828015/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 20:32:28  来源:igfitidea点击:

Exception in thread "main" java.util.NoSuchElementException: No line found - Using scanner input

javainputlinked-listnodes

提问by Shawn

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!

我正在尝试从链表中删除特定节点。我正在尝试调用我的方法 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.<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

采纳答案by Jason C

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:

问题是您正在关闭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!

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. :-)

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

回答by PM 77-1

As per How to solve java.util.NoSuchElementException in Java(as well as common sense) use the appropriate kind of hasNextmethod before each next.

根据How to solve java.util.NoSuchElementException in Java(以及常识)hasNext在每个next.

In your particular case, it will be something like this:

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

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