2013-03-15 49 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()會導致頭痛。