当前位置: 首页 > 知识库问答 >
问题:

为什么使用sc.nextLine()不是将控制转移到下一行输入的正确方法?

利永年
2023-03-14

我在解决黑客银行的“30天代码”问题8。

这是我写的代码:

import java.util.*;
import java.io.*;
public class Directory
{
    public static void main(String args[])throws NoSuchElementException
    {
        Scanner sc=new Scanner(System.in);
        //System.out.println("Enter number");
        int n=sc.nextInt();
        sc.nextLine();
        Map<String,String> Directory= new HashMap<String,String>();
        for (int i=0;i<n;i++)
        {
         //System.out.println("Enter name and phone number");
         String name=sc.next();
         String ph=sc.next();
         sc.nextLine();
         Directory.put(name,ph);
        }
         while(sc.hasNext())
         {
         String s = sc.next();
         sc.nextLine();
         String phoneNumber = Directory.get(s);
         System.out.println((phoneNumber != null) ? s + "=" + phoneNumber : "Not found");
        }

    }
}

当我使用自定义输入运行此代码时,我得到如下错误:

线程“main”java中出现异常。util。NoSuchElementException:在java中找不到行。util。扫描仪。下一行(Scanner.java:1585)位于目录下。main(Directory.java:23)

我认为这是由于while循环中的“sc.nextLine()”造成的。但我不知道为什么。我从这里了解到,在使用sc.next()之后,我应该使用sc.nextLine(),以便将控件转移到下一行输入。知道我哪里出错了吗?

共有2个答案

谢承
2023-03-14

文件中:

public String Next()查找并返回此扫描仪中的下一个完整令牌。完整令牌的前面和后面都有与分隔符模式匹配的输入

以及扫描仪的文档:

扫描器使用定界符模式将其输入拆分为标记,默认情况下,定界符模式匹配空白

空白包括\n\r

因此,作为结论,使用nextLine()来解决换行符问题在nextInt()的情况下是有效的,但在使用Next()的情况下则不是。

葛奇
2023-03-14

我想这对你有用。试试看:)你不需要这一行sc.nextLine()

public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter number");
        int n=sc.nextInt();
        Map<String,String> directory= new HashMap<>();
        for (int i=0;i<n;i++)
        {
            System.out.println("Enter name and phone number");
            String name=sc.next();
            String ph=sc.next();
            sc.nextLine();
            directory.put(name,ph);
        }

        while(sc.hasNext())
        {
            String s = sc.next();
            sc.nextLine();
            String phoneNumber = directory.get(s);
            System.out.println((phoneNumber != null) ? s + "=" + phoneNumber : "Not found");
        }

    }

 类似资料:
  • 问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但这是完全不同的类型- 返回a 作为原始类型。我发现最

  • 问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非雇用了ugly,否则我似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但它是完全不同的类型- 返回a 作为原始类型。我发现

  • 我正在使用kubeadm工具创建kubernetes v1.7集群。 在我的主机上公开服务“echoheaders”非常简单。库贝。com使用外部ip 创建正在运行的部署: 从部署中公开服务: 从web浏览器访问: 现在,我想使用本指南中基于角色的入口控制器公开相同的服务echoheaders:https://github.com/kubernetes/ingress/tree/master/ex

  • 最近,sonatype使maven central支持https(背景信息)。现在,我在pom.xml中添加了以下片段,以强制在任何地方使用https: null 它看起来是不够的,例如,仍然使用了程序集插件HTTP:

  • 问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的

  • 问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提