Java 当我从扫描器读取数据时出现奇怪的输出

Java 当我从扫描器读取数据时出现奇怪的输出,java,Java,我正在尝试用基本的CRUD操作创建一个视频商店。为了制作每部电影,我需要阅读以下标题、年份和性别: 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:

我正在尝试用基本的CRUD操作创建一个视频商店。为了制作每部电影,我需要阅读以下标题、年份和性别:

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");
    }
}
static ArrayList movies=new ArrayList();
静态扫描仪输入=新扫描仪(系统输入);
公共静态void InserirFilme(){
字符串名;
国际年;
字符串性别;
布尔存在=假;
系统输出打印(“名称:”);
name=in.nextLine();
系统输出打印(“年:”);
年份=in.nextInt();
in.nextLine();
系统输出打印(“性别:”);
性别=in.next();
电影=新电影(姓名、年份、性别);
电影(m:电影)
{
如果(电影==m)
{
存在=真实;
}
}
如果(!存在)
{
添加(电影);
}
其他的
{
System.out.println(“电影已经存在于视频商店中”);
}
}
当我进入addMovie选项时,我在控制台上得到这个打印(名称:year:)有人能解释一下为什么会发生这种情况吗?我已经搜索了很多次,我不明白为什么:S

我理解您的问题的方式是,您将输出(名称:year:)放在一行中,并希望它放在单独的行中?在这种情况下,您只需使用
System.out.println(字符串)而不是
系统输出打印(字符串)
。另一方面,当需要在字符串中使用换行符时,也可以使用“\n”。希望我能帮助你:)


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

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

显示“名称:”后,输入一些文本并按enter键,以便年份和性别字段将获得正确的值

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

我建议使用

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

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

System.out.print("gender: ");
gender = in.nextLine();
(你可能指的是“流派”而不是“性别”)

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

if(movie == f)

您在循环中运行此方法(对吗?)
第一个调用正确读取输入,但在最后一个
in.next()

在下一次调用时,将打印
名称:
,然后扫描仪从
系统中读取空字符串。
中,因为此处已存在换行符。
之后,
年份:
打印在同一行上,因为没有输入新的换行符

因此,在阅读
gender
(或
genre
:)之后,您只需在.nextLine()中插入另一个

或者对阅读体裁使用
nextLine()
,而不是
next()
,因为体裁可能有多个单词

但是使用fake
nextLine()
来“吃”换行符有一些缺点-可能还有另一个文本您没有处理。这是一种糟糕的做法-丢失用户输入的数据。
最好从行中读取所有数据,然后验证/解析它,检查是否有额外的数据,如果数据无效,则显示通知并让他尝试输入正确的值

下面是一些如何手动处理用户输入的示例-。这有助于自学。
尝试概括用户输入操作:

name = validatedReader.readPhrase("name: ");
year = validatedReader.readNumber("year: ");
genre = validatedReader.readWord("genre: ");
其中,
ValidatedReader
Scanner
的自定义包装器,它可以使用您自己的验证规则,并可以在输入错误后轻轻地重新询问用户。 它还可以验证日期、电话号码、电子邮件、url等等

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

您可以为字符串和整数类型输入不同地实例化Scanner类。它对我有用:)

例如:

静态扫描仪in1=新扫描仪(System.in)
静态扫描仪in2=新扫描仪(System.in)

请使用nextLine()表示“姓名”和“性别”。它可能包含多个单词。让我知道它是否有效

例如:

系统输出打印(“名称:”)
name=in1.nextLine()
系统输出打印(“年:”)
年份=in2.nextInt()
系统输出打印(“性别:”)
性别=in1.nextLine()


什么是“f”以及为什么在循环中不使用“m”:/为什么你用
==
而不是
来比较电影呢?你能在实现scanner的地方发布更完整的代码吗。。。还是就这些?@px06:@DenisKurochkin我知道什么是Scanner类。我问的是他正在实例化扫描仪的部分,然后运行
,而
循环进行输入。这不是问题,在出现年份之前,控制台应该等待名称的输入,然后向我显示年份以输入年份。现在我知道你的意思了,你是如何初始化扫描仪的?对我来说,它与Scanner in=newscanner(System.in)一起工作;我学到的是,如果本例名称中的字符串有超过1个单词,我应该使用nextLine,如果没有,我可以使用next,在本例中,我可以制作一部名为蝴蝶效应的电影,有2个单词。问题不在于性别,问题在于我尝试键入第一个输入(名称)在此之前,控制台只显示名称:年份:这是打印上显示的内容,问题是它打印名称,然后它应该读取电影名称,但它打印年份:问题是读取名称之前出现的内容。在c