2012-01-18 57 views
0

我想用NetBeans在Java中調試一個方法。爲什麼NetBeans Java調試器永遠無法訪問此代碼?

這種方法是:

public Integer getNumberOfClamps(Locations paLocation) { 
     Integer ret = -1; 
     List list = new ArrayList(); 

     String removeme = "ABC"; 

     if (paLocation == null) { 
      return ret; 
     } 

     try { 
      IO io = new IO(this.getSchemaName()); 
      Session session = io.getSession(); 

      String sql = "select count(*) from assets a join assettypes at on (at.id = a.assettype_id) "; 
      sql += "where a.currentlocation_id = " + paLocation.getId() + " and at.clamp = 1 and at.active = 1;"; 
      list = session.createQuery(sql).list(); 

      // for some reason, list is empty yet MySQL reports 40 records 
      // and the following two lines are never reached! 
      ret = list.size(); 
      removeme = "WHAT???"; 

     } catch (Exception ex) { 
      ret = -1; // explicitly set return 
     } finally { 
      return ret; 
     } 
    } 

邁向方法的中間,你會看到list = session.createQuery(sql).list();

出於某種原因,這是返回即使當SQL手動運行,我得到一個空列表40結果。

但奇怪的是,一旦.list()被調用,它會跳轉到finally塊,永遠不會到達其餘!因此,對於測試,'removeme'應該等於WHAT???,但調試器仍將其報告爲ABC

什麼給?

+0

你確定*它不通過catch塊嗎?這聽起來像是一個異常正在拋出...... – 2012-01-18 21:17:58

+1

這是可怕的異常處理,你吃任何異常,所以你怎麼知道發生了什麼,至少打印出堆棧跟蹤! – 2012-01-18 21:20:21

+0

@JonSkeet絕對確定。我在異常塊中有其他代碼。你看到的只是一個瘦身的例子。 – cbmeeks 2012-01-18 21:29:30

回答

1

您正在使用錯誤的方法。 'createQuery'期待HQL語法。改變你的方法到'createSQLQuery'

+0

絕對地釘牢它。我沒有明白。我改變它創建SQLQuery,我得到了40像我想象的。謝謝! – cbmeeks 2012-01-18 21:31:48

+0

@cbmeeks:把這不能解釋發生了什麼......你應該調查一下。我強烈懷疑有一個異常*被拋出 - 或者你在某種程度上調試了錯誤的代碼版本。 Java *不會僅僅跳過那樣的代碼。 – 2012-01-18 21:41:13

+0

@JonSkeet的權利。我認爲調試器是這裏真正的罪魁禍首。指責Java可能有點過於苛刻。大聲笑 – cbmeeks 2012-01-18 21:44:29

相關問題