从扫描仪读取时输出奇怪

时间:2016-09-16 08:09:38

标签: java

我正在尝试使用基本的CRUD操作创建 videoStore 。为了制作每部电影,我需要阅读标题,年份和性别,如下所示:

System.out.print("name: ");
name = in.nextLine();
System.out.print("year: ");
year = in.nextInt();
in.nextLine();
System.out.print("gender: ");
gender = in.next();

当我输入 addMovie 选项时,我在控制台上获得此打印

(name: year:) 

有人可以向我解释为什么会发生这种情况吗?

以下是该方法的其余部分:

static ArrayList<Movie> movies = new ArrayList<Movie>();
static Scanner in = new Scanner(System.in);

public static void InserirFilme() {
    String name;
    int year;
    String gender;
    boolean existe = false;
    System.out.print("name: ");
    name = in.nextLine();
    System.out.print("year: ");
    year = in.nextInt();
    in.nextLine();
    System.out.print("gender: ");
    gender = in.next();

    Movie movie = new Movie(name, year, gender);
    for(Movie m: movies)
    {
        if(movie == m)
        {
            existe = true;
        }
    }

    if(!existe)
    {
        movies.add(movie);
    }
    else 
    {
        System.out.println("the movie already exists in the videoStore");
    }
}

5 个答案:

答案 0 :(得分:1)

调用next不会删除换行符,这意味着下次调用InserirFilme时,可以立即完成读取名称的调用。使用nextLine

System.out.print("gender: ");
gender = in.nextLine();

(你可能意思是“流派”而不是“性别”)

此外,正如评论中所述,此检查永远不会成功:

if(movie == f)

答案 1 :(得分:0)

  

当我输入addMovie选项时,我在控制台上获得此打印(名称:年份:)可以有人解释我为什么会发生这种情况我已经搜索了很多而我无法理解为什么:S

我理解你的问题的方式是你在一行中得到输出(名字:年份:)并希望它在单独的行中?在这种情况下,您只需使用System.out.println(String);而不是System.out.print(String)。另一方面,您也可以使用&#34; \ n&#34;只要你想在String中使用换行符。希望我能帮助你:)。

编辑:如果这不是您问题的答案,请随时告诉我并澄清您的问题:)

答案 2 :(得分:0)

对于您使用的字符串名称in.nextLine();即在整行输入的数据将被添加到名称字符串中。

&#34;姓名:&#34;显示,输入一些文字和按回车键,这样年份和性别字段将获得正确的值。

编写的代码是正确的,但您没有通过扫描仪提供适当的输入。

我建议使用

String name = in.next();//instead of String name = in.nextLine();

答案 3 :(得分:0)

你在循环中运行这个方法(对吗?)
第一个调用正确读取输入,但它在最后System.in之后的in.next()中留下了换行符 在下一个电话上打印name:,然后扫描程序从System.in读取空字符串,因为此处已存在换行符。
然后,year:打印在同一行,因为没有输入新的换行符。

因此,您只需在阅读in.nextLine()(或gender :)后插入另一个genre。 或者使用nextLine()代替next()而不是nextLine(),因为类型可能包含多个单词。

但使用假的name = validatedReader.readPhrase("name: "); year = validatedReader.readNumber("year: "); genre = validatedReader.readWord("genre: "); 来“吃”是有一些弊端。 linebreak - 可能还有另一个您没有处理过的文本。这是一种不好的做法 - 放松用户输入的数据 最好从行读取所有数据,然后验证/解析它,检查是否有一些额外数据,如果数据无效,则显示通知并让他尝试输入正确的值。

以下是一些如何手动处理用户输入的示例 - https://stackoverflow.com/a/3059367/1916536。这有助于自学 尝试概括用户输入操作:

ValidatedReader

其中ScannerJTable的自定义包装器,它可以使用您自己的验证规则,并且可以在输入错误后轻轻地重新询问用户。 它还可以验证日期,电话号码,电子邮件,网址

出于生产目的,最好将验证框架与可配置的验证规则结合使用。有许多用于不同目的的验证框架 - Web,UI,REST等......

答案 4 :(得分:0)

您可以针对String和Integer类型输入以不同方式实例化Scanner类。它对我有用:)

示例:

  

静态扫描仪in1 =新扫描仪(System.in);
      static Sc​​anner in2 = new Scanner(System.in);

请使用nextLine()作为&#39; name&#39;和&#39;性别&#39;。它可能包含多个单词。如果有效,请告诉我。

示例:

  

System.out.print(&#34;名称:&#34;);
              name = in1.nextLine();
              System.out.print(&#34;年:&#34;);
              year = in2.nextInt();
              System.out.print(&#34;性别:&#34;);
              gender = in1.nextLine();