2017-07-30 32 views
0

我在Android中運行並調試了此java代碼,並且我注意到return true沒有任何作用,因爲它充當break,然後return false最終被執行。我已經使用Android Studio及其Step Over功能進行調試。在java中嘗試使用返回值時出現混淆執行

protected Boolean doInBackground(Void... params) { 
    // Cancel discovery because it will slow down the connection 
    mAdapter.cancelDiscovery(); 
    // Start connection attempt 
    for(int i=0;i<10;i++) { 
     try { 
     // Connect the device through the socket. This will block 
     // until it succeeds or throws an exception 
     mmSocket.connect(); 
     // connection successful [it should return true] 
     return true; 
     } 
     catch (IOException connectException) { 
     // Unable to connect; close the socket and get out 
     try { mmSocket.close(); } 
     catch (IOException closeException) { } 
     } 
    } 
    // connection failed 10 times [but it always returns false] 
    return false; 
} 

UPDATE:

像EJP和其他人說,return true不作爲休息。 doInBackground函數按預期運行。問題是,由於外部代碼塊,執行之後,AsyncTask總是被取消。對此我很抱歉。

此信息可以被關閉。謝謝。

+0

如果你寫一個返回,它總是作爲一個休息。再加上即使你的連接發生了一些異常,你只是捕獲它而不在那之後返回。爲什麼你想把你的connect語句放在for循環中。即使您希望確保連接一直保持連接狀態,請在do while循環中執行此操作,並在連接成功建立時進行檢入。 –

+0

這是不是很好的編程,因爲我使用循環內的return語句,這會導致垃圾收集故障。 –

+0

@FadySaad不,它不會導致垃圾收集故障。無法想象你有什麼想法。 – EJP

回答

0

我已經運行和調試在安卓這個Java代碼,我已經注意到了,還真沒有效果

只有當有一個例外。十個例外。

,因爲它作爲一個休息

不,它不需要。

然後返回false最終被執行。

不,它不。最後return可以達到的唯一方法是,如果有十個例外。

Ergo there was an exception。十個例外。第一個是ConnectException,之後的所有內容都與您無效嘗試重新連接相同套接字而不是先創建新套接字有關。

追查異常並親自查看。

0

你確定沒有例外嗎?從你的代碼中,如果.connect方法沒有問題,它將返回true,嘗試記錄你的異常以檢查連接是否成功。

+0

這是一條評論,而不是答案。 – Aubin

+0

使用此代碼,您無法知道是否拋出了異常。 –

+1

這就是答案,您需要在檢查代碼流之前確保連接成功。 –

0

如果發生異常,return true將不會生效。爲什麼false返回,因爲異常被無聲捕捉。

我可以給你這裏的示例代碼,

private static void connect() throws Exception 
{ 
    throw new Exception(); 
} 

private static Boolean doInBack() { 
    for (int i = 0; i < 10; i++) { 
     try { 
      if (i % 7 != 0 || i == 0) 
       continue; 
      connect(); 
      return true; 
     } catch (Exception e) { 
      System.out.println("Exception"); 

     } 
    } 

    return false; 
} 
public static void main(String[] args) 
{ 
    System.out.print(doInBack()); 

} 

有關try-catch-finally-return執行順序的參考。

+0

請給我一個原因,我爲什麼downvoted。 – caisil

+0

我沒有讓你失望。感謝您的回答。 –

+0

只有當他/她給出合理的解釋時,每個人都可以降低其他人的滿意度。 – caisil

0

與EJP所說的類似,try-catch中的代碼失敗10倍,而不是因爲return true不符合您的預期。而當它失敗10倍時,它應該是,你最終在return false

需要登錄您的connectExceptioncloseException,至少像e.printStackTrace

另外,不要讓多個return短暫的你。試着這樣說:

protected Boolean doInBackground(Void... params) { 
    ... 
    boolean success = false; 
    for (int i = 0; i < 10; i++) { 
     try { 
     ... 
     mmSocket.connect(); 
     success = true; 
     } catch (IOException connectException) { 
     ... 
     } 
    } 
    return success; 
} 

如果connect()成功,那麼success = true,否則success將保持false。 (現在毫無疑問,你的困惑爲什麼一個回報行爲像一個休息)

作爲一個側面說明,是的,沒有更多的上下文在這裏,你可能需要考慮,如果第一個connect()失敗,那麼有可能所有後續的連接也會。

相關問題