使用Scanner读取输入时出现NoSuchElementException错误

3
以下Java方法应该从用户通过键盘输入一个字符串(人的姓名),在名为name [] 的数组中搜索该姓名,并从该数组中删除该人的姓名(通过分配name [i] =“INVALID”)。
代码尝试使用Scanner类对象del_name 接受输入字符串(人的姓名),但我在语句中得到了NoSuchElementException
s=del_name.next();

即从顶部开始的第4个语句。

如果有人能提供解决方案并解释为什么这段代码无法正常工作,我将非常感激。(谢谢)

void Deletee()
{


      Scanner del_name=new Scanner(System.in);

      String s;

      System.out.println("Enter the name to be deleted");

      s=del_name.next(); // causing NoSuchElementException

      int i=0;

   /* find position in which the name occurs using while-loop below */


      while(!s.equalsIgnoreCase(name[i]) && i<count) 

             i++ ;  // increment i to search in next array index



      if(i<count)
      {
          name[i]="INVALID";

          count--;

          System.out.println("Deletion Successful");
      }
      else
      {

          System.out.println("No such person exist");

      }

      del_name.close();


}
3个回答

1
.next() 改为 .nextLine()
Scanner del_name=new Scanner(System.in);

String s;

System.out.println("Enter the name to be deleted");

s=del_name.nextLine(); 

Scanner.next() 返回当前输入的内容,即使没有任何内容也会返回(导致错误)。Scanner.nextLine() 跳过当前行,并返回被跳过的部分。

0

试一试,

del_name.nextLine()

使用next()仅返回空格之前的内容。 nextLine()在返回当前行后自动将扫描仪向下移动。

next():查找并返回此扫描仪的下一个完整标记。
nextLine():推进此扫描仪到当前行并返回被跳过的输入。


0
您所发布的代码本身不会抛出异常。您可能在调用此方法之前做了一些其他操作导致了这种情况。为了证明这一点,请运行以下代码:
public class Test {

    static String[] name = new String[] {"AAA", "BBB", "CCC"};

    static void deletee() {

        Scanner delName = new Scanner(System.in);
        System.out.println("Enter the name to be deleted");
        String s = delName.next();

        boolean found = false;
        for (int i = 0; i < name.length; i++) {
            if (name[i].equalsIgnoreCase(s)) {
                name[i] = "INVALID";
                System.out.println("Deletion Successful");
                found = true;
                break;
            }
        }
        if (!found)
            System.out.println("No such person exist");
        delName.close();
    }

    public static void main(String[] args) {

        deletee();
        for (int i = 0; i < name.length; i++)
            System.out.print(name[i] + ", ");
    }
}

  • 方法名应以小写字母开头。
  • 非 final 变量不应使用下划线,而是在每个新单词开始时使用大写字母。
  • 我改写了搜索机制,使其更加直观,虽然还有许多其他方法可以做到这一点。
  • 关闭扫描器工作得很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接