2011-04-26 89 views
1

我正在學習Java並剛剛開始使用mysql進行遊戲,並且在使用python工作的某些邏輯中遇到了一些問題,而且我在轉換時遇到了麻煩。突破了Java中的循環邏輯

我基本上有一個try語句,試圖搜索數據庫中是否存在記錄。如果它確實很好,它會繼續前進,但是如果記錄不存在,那麼它會添加它。這裏是我的代碼

try 
{ 
    PreparedStatement Findstatement; 
    Findstatement = con.prepareStatement(" SELECT DataMaster_MasterCode FROM Allocation WHERE Master_Code = (?) and date = (?)"); 
    Findstatement.setInt(1, Code); 
    Findstatement.setString(2, AllocationDate); 
    ResultSet CodeAll = Findstatement.executeQuery(); 
    int DataMaster_MasterCode; 
    while (CodeAll.next()) 
    { 
     DataMaster_MasterCode = CodeAll.getInt("DataMaster_MasterCode"); 
    } 


    System.out.println("Found allocation " + DataMaster_MasterCode + " already exists for " + Name); 

} 
catch (Exception e) 
{ //Create statements... } 

問題是,它一直要到異常,因爲DataMaster_MasterCode變量可能不被可能不被初始化。我認爲,因爲python只是執行代碼,所以它在python中工作,但是因爲java預編譯它,它認爲這是一個錯誤,並跳過。如果變量不是可能未初始化的,我希望它失敗並轉到catch語句(它創建變量)。

現在它保持失敗並且不斷創建(複製)條目,因爲它永遠不會完成查找數據本身的語句。我想過放一個else if語句來檢查變量是否爲空然後中斷,但它對我也不起作用。

請幫助我的邏輯。

+0

由於您正在讀取可能尚未初始化的變量('DataMaster_MasterCode'),因此應該不會進行編譯。你的代碼*真的*看起來像什麼?另請注意,Java約定是以小寫字母開頭的局部變量名稱。遵循約定使經驗豐富的Java開發人員更容易理解您的代碼並查看真正的問題,而不是絆倒那些並不重要的古怪事物。 – erickson 2011-04-26 21:27:22

+0

*「它繼續執行異常,因爲DataMaster_MasterCode變量可能不會被初始化」* ...不,它不會被初始化。這不是一個例外。 – 2011-04-26 21:28:01

+0

這是我的代碼..它不會運行我發佈的代碼,並直接進入catch部分。我改變了變量的名字,使他們更容易理解它在做什麼,但是除此之外它是我的代碼。我會修復我的命名對話,我只是意識到我正在使用自己的風格(我會閱讀正確的命名)。 – Lostsoul 2011-04-26 21:36:12

回答

5

您應該只在例外情況下使用異常處理。檢查未初始化的值不是其中之一。要檢查Java中的空值,只需使用(variable == null)。

+0

好吧我會更多地看trys語句..我基本上需要它來嘗試一些事情,如果它不起作用,那麼做一些其他的事情..它可能會在任何數量的點失敗,所以如果語句不容易。如果我檢查null變量,它會確認它爲空,但它不會讓我跳出try語句並進入catch語句。 – Lostsoul 2011-04-26 21:24:29

+0

你不能闖入catch塊。您可以創建一個方法來處理錯誤,並在catch塊中調用它,以及如果您得到空值。捕捉可能意想不到的異常也就沒有錯,即當邏輯失敗時,但正如Zian已經說過的那樣,單變量變量不在其中。您應該盡最大努力防止預期的異常或修復代碼錯誤(未初始化的變量)。 – Thomas 2011-04-26 21:28:34

+0

這是因爲'try'和'catch'語句旨在處理異常 - 根據定義,這不是正常情況。它們適用於不應發生的情況,不適用於流量控制。如果你有一個足夠普遍的情況,你有代碼來檢查它,那麼它不是一個例外情況(並且不應該使用try/catch)。 – cHao 2011-04-26 21:28:35

1

你首先必須給變量賦空值,否則你也會得到一個異常。請注意,局部變量未初始化爲任何默認值,因此請執行DataMaster_MasterCode = 0;等。