线程“main”中的异常java.util.NoSuchElementException:找不到行 - 使用扫描仪输入 [英] Exception in thread "main" java.util.NoSuchElementException: No line found - Using scanner input

查看:759
本文介绍了线程“main”中的异常java.util.NoSuchElementException:找不到行 - 使用扫描仪输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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类:

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:

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


推荐答案

问题是你要关闭 System.in Scanner.close() 关闭基础流)。一旦这样做,它就会保持关闭状态,并且无法输入。您通常不希望使用标准输入:

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

这篇关于线程“main”中的异常java.util.NoSuchElementException:找不到行 - 使用扫描仪输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆