扫描仪拾取垃圾值?

时间:2013-03-15 22:52:58

标签: java java.util.scanner

我正在开发一个菜单驱动的程序,其中包含用户想要做的数字选项。输入2后,用户可以通过输入新地址来更新地址,如下所示:

if (edit == 2) {
    System.out.print("Please enter your new address: ");
    String address = in.nextLine();
    stmt.executeUpdate("UPDATE PATIENTS " +
        "SET ADDRESS = '" + address + "' " +
        "WHERE LOGIN = '" + username + "'");
}

我遇到的问题是,一旦用户输入选项2,他们就永远无法尝试输入他们的地址,因为程序认为输入了空值然后尝试执行更新语句在数据库上,由于地址不能是NULL而失败。

是否有理由认为我遗失了垃圾值?对于用户尝试使用in.next()in.nextInt()编辑其姓名,年龄等的其他选项,似乎没有问题。无论出于何种原因,in.nextLine()在用户有机会输入任何内容之前默认为NULL

我在阅读String trash = in.next();之前尝试过in.nextLine()行。这会阻止程序崩溃,但它会切断地址的数字部分。

2 个答案:

答案 0 :(得分:1)

您可能正在使用in.nextInt()来检索edit。当您这样做时,输入流上仍会有换行符(\n),因此您对in.nextLine()的调用将检索该换行符。其他方法将忽略空格,因此新行由它们使用并且它们按预期工作。

如果您拨打in.nextLine()两次,则第二次通话将返回您要查找的线路。或者,您可能希望在检索in.nextLine()值时调用edit并从那里解析整数。

答案 1 :(得分:0)

尝试把这个

in.skip("\r\n|[\n\r\u2028\u2029\u0085]");

正好在

之上
in.nextLine();

应该阻止你跳过输入,如果你使用任何类型的循环也会很好,因为有时额外的in.nextLine()会引起麻烦。