2013-03-15 51 views
0

我正在开发一个程序,该程序由用户想要执行的数字选项进行菜单驱动。在进入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

我曾尝试在读in.nextLine()之前放一行。这会阻止程序崩溃,但会切断地址的数字部分。

+2

这与您遇到的问题无关,但请阅读有关SQL注入的内容,因为您的代码存在一个典型的安全问题:http://www.unixwiz.net/techtips/sql-injection .html – svk 2013-03-15 22:56:48

+0

使用'PreparedStatement'或见面[Little Bobby Tables](http://xkcd.com/327/) – jlordo 2013-03-15 23:04:50

+0

谢谢你们的友好提醒! – raphnguyen 2013-03-15 23:18:24

回答

1

您可能正在使用in.nextInt()检索edit。当你这样做的时候,输入流上仍然会有一个换行符(\n),所以你对in.nextLine()的调用正在检索该换行符。其他方法将忽略空白,以便新行被它们使用,并且它们按预期工作。

如果您拨打in.nextLine()两次,第二个电话将返回您正在查找的行。或者,您可能需要在检索edit值并从中解析整数时调用in.nextLine()

+0

谢谢,这个伎俩。标准做法是什么?是否最好调用'in.nextLine()'并将其解析为数字驱动菜单的整数? – raphnguyen 2013-03-15 23:18:03

+0

这真的取决于你在做什么。如果你的所有菜单都是数字,那么不要调用'in.nextLine()'就好了。无论何时,当你在输入中留下换行符时,你需要考虑两者之间的混合,并确保将其消耗。当你将这两者混合在一起时,这真是一个设计决定。只需调用'in.nextInt()'然后'in.nextLine()'就可以更容易地清除数字后面的所有内容。这也有助于用户在同一行输入多个数字,因为它会在第一个数字后面忽略所有数字,而不是试图将其用于未来值。 – Cameron 2013-03-15 23:26:13

0

尝试把这个

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

只是

in.nextLine(); 

上面应该让你从跳过输入,如果您使用任何类型的循环,因为有时候一个额外的也将是不错.nextLine()会导致头痛。