2016-12-12 44 views
1

我正在努力與一個簡單的方法,應該給我一個對象,但使用解析(connectionRequest,readresponsepostresponse)它總是給我可以爲空值。我的代碼Codename一個解析

Paiement P = new PaiementDAO().FindByCardNumber("5300721124642197"); 
System.out.println("hi "+P.getCardHolderName()); 

輸出始終執行system.out.println第一,然後進入findby方法有什麼不對

實例?

這是我的全部代碼

`  public Paiement FindByCardNumber(String CardNumber) { 
Paiement P = new Paiement(); 
     ConnectionRequest connectionRequest; 
     connectionRequest = new ConnectionRequest() { 
      List<Paiement> colors = new ArrayList<>(); 

      @Override 
      protected void readResponse(InputStream input) throws IOException { 
       System.out.println("hi read response"); 
       JSONParser json = new JSONParser(); 
       try { 
        Reader reader = new InputStreamReader(input, "UTF-8"); 

        Map<String, Object> data = json.parseJSON(reader); 

        List<Map<String, Object>> content 
          = (List<Map<String, Object>>) data.get("root"); 
        colors.clear(); 
        for (Map<String, Object> obj : content) { 
         colors.add(
           new Paiement((String) obj.get("cardholdername"), (String) obj.get("cardnumber"), (String) obj.get("expirationdate"), (String) obj.get("securitycode"), (String) obj.get("type"), Float.parseFloat((String) obj.get("solde")))); 
        } 
       } catch (IOException err) { 
       } 
      } 

      @Override 
      protected void postResponse() { 
       System.out.println("hi post response"); 

       for (Paiement x : colors) { 
        P = x; 
        System.out.println(P); 
    return; 
       } 
      } 

     };enter code here 
     connectionRequest.setUrl("http://localhost/payement/findbynumber.php?num=" + CardNumber); 
     NetworkManager.getInstance().addToQueue(connectionRequest); 
    return P;` 
+0

永遠不要發生這樣的異常。在沒有記錄的情況下很可能會吞下一個錯誤。我建議在響應的第一行放置一個斷點,然後跨越代碼。你有價值嗎?它很不清楚是什麼問題,但你可以很容易地看到它通過檢查變量, –

+0

如果我添加一些(system.out.println)我得到想要的值,但問題是,當這個代碼執行時,首先要執行的事情是那些行: {connectionRequest.setUrl(「http://localhost/payement/findbynumber.php?num =」+ CardNumber); NetworkManager.getInstance()。addToQueue(connectionRequest); return P;'} –

+0

好的,你的問題並不清楚。 'addToQueue'是異步的。你可以用'addToQueueAndWait()'代替它。 –

回答

1

也許您在找什麼?

connectionRequest.setPost(false); 

我不確定,但我認爲它默認設置爲true。

+0

同樣的事情沒有工作 –

+0

它可能沒有解決這個問題,但@卡洛斯是正確的...你有一個請求。 –

1

如果你的執行順序的假設是正確的 - DAO.FindByCardNumber可能返回懶對象或未來,而不是找到了一個和實際執行findbyP接入時刻或在不同的線程。

要確認你應該System.out.println之前調用P.getCardHolderName()和跟蹤實際的執行順序(是P場在DAO.FindBy*P.getCardHolderName()初始化?)。

UPDATE:

是的,你的DAO是異步的,真正的發現與主線程並行執行。所以System.out.println提前開始,必須等待DAO請求完成。

+0

是的,我已經初始化P在DAO.findBy,但它始終保持運行它的方式執行System.out.println()然後它執行DAO.findBy我會告訴你我的代碼: –

+0

public Paiement FindByCardNumber(String CardNumber){Paramment P = new Paiement(); ConnectionRequest connectionRequest; connectionRequest = new ConnectionRequest(){ List colors = new ArrayList <>(); @Override protected void readResponse(InputStream input)throws IOException System.out.println(「hi read response」); JSONParser json = new JSONParser(); 嘗試Reader reader = new InputStreamReader(input,「UTF-8」); –

+0

Map data = json。parseJSON(讀取器); List > content =(List >)data.get(「root」); colors.clear(); (字符串)obj.get(「cardholdername」),(字符串)obj.get(「cardnumber」),(字符串) (Map obj:content){ colors.add( ) obj.get(「expirationdate」),(String)obj.get(「securitycode」),(String)obj.get(「type」),Float.parseFloat((String)obj.get(「solde」))) ); } –