2011-04-26 90 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;等。