2017-07-30 3 views
0

Ich habe diesen Java-Code in Android ausgeführt und debuggte und ich habe festgestellt, dass die return true hat keine Wirkung, weil es als break handeln und dann die return false wird schließlich ausgeführt. Ich habe das Android Studio und seine Step-Over-Funktion zum Debuggen verwendet.Confused Ausführung in Versuch mit Rückgabewert in 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:

Wie EJP und andere sagen, return true nicht als Bruch handeln. Die doInBackground Funktion wird wie erwartet ausgeführt. Das Problem war, dass die AsyncTask wegen eines externen Codeblocks immer sofort nach der Ausführung von return true abgebrochen wurde. Das tut mir leid.

können Dieser Beitrag geschlossen. Vielen Dank.

+0

Wenn Sie eine Rückkehr in schreiben, denn es fungiert immer als eine Pause. Und selbst wenn eine Ausnahme in Ihrer Verbindung auftritt, fangen Sie sie nur ab und kehren danach nicht mehr zurück. Warum möchten Sie Ihre connect-Anweisung in eine for-Schleife setzen? Auch wenn Sie sicherstellen möchten, dass es solange weiter versucht, bis Sie eine Verbindung herstellen, tun Sie dies in einer do while-Schleife und checken Sie ein, wenn die Verbindung erfolgreich hergestellt wurde. –

+0

es ist nicht sehr gute Programmierung, weil ich die return-Anweisung innerhalb einer Schleife verwenden, und dies würde dazu führen, dass Garbage Collection fehlschlagen. –

+0

@FadySaad Nein, es würde nicht zur Fehlfunktion der Speicherbereinigung führen. Ich kann mir nicht vorstellen, wo Sie diese Idee haben. – EJP

Antwort

0

Ich habe laufen und debuggen diesen Java-Code in Android und ich bemerkt habe, dass die Rückkehr wahr keine Wirkung

Nur wenn es eine Ausnahme hat. Zehn Ausnahmen.

weil es

als Bruch handeln

es nicht der Fall ist Nein.

und dann wird die Rückgabe false schließlich ausgeführt.

Nein, tut es nicht. Die einzige Möglichkeit, das finale return zu erreichen, ist, wenn es zehn Ausnahmen gibt.

Ergo dort war eine Ausnahme. Zehn Ausnahmen. Der erste war ein ConnectException, und die danach waren alle auf Ihren ungültigen Versuch zurückzuführen, den gleichen Socket neu zu verbinden, anstatt zuerst einen neuen zu erstellen.

die Ausnahmen Trace und für sich selbst sehen.

0

Sind Sie sicher, dass es keine Ausnahme? aus dem Code, wird es true zurück, wenn es nicht Problem mit .Connect Methode, versuchen Sie Ausnahme zu protokollieren, was die Verbindung erfolgreich ist zu überprüfen.

+0

Dies ist ein Kommentar, keine Antwort. – Aubin

+0

Mit diesem Code können Sie nicht wissen, ob eine Ausnahme ausgelöst wird oder nicht. –

+1

Und das ist die Antwort, Sie müssen sicherstellen, dass die Verbindung erfolgreich ist, bevor Sie den Codefluss überprüfen. –

0

Wenn es eine Ausnahme auftritt, nehmen die return true nicht wirksam. Warum false zurückgegeben, weil die Ausnahme stillschweigend abgefangen wurde.

Ich kann Ihnen ein Beispiel-Code hier,

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()); 

} 

Eine Referenz über die try-catch-finally-return Ausführungsreihenfolge.

+0

Bitte geben Sie mir einen Grund, warum ich abgelehnt wurde. – caisil

+0

Ich habe dich nicht abgelehnt. Danke für deine Antwort. –

+0

Jeder kann andere nur dann ablehnen, wenn er/sie eine vernünftige Erklärung gibt. – caisil

0

Ähnlich wie EJP sagte, ist Ihr Code in der Try-Catch 10x fehlgeschlagen, nicht weil die return true verhält sich nicht so, wie Sie es erwartet haben. Und wenn es 10x fehlschlägt, wie es sollte, enden Sie bei return false.

Sie Notwendigkeit anmelden Ihre connectException und closeException, zumindest mit so etwas wie e.printStackTrace.

Auch lassen Sie nicht mehrere return 's kurze Sicht Sie. Probieren Sie es wie folgt aus:

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; 
} 

wenn connect() erfolgreich ist, dann success = true, sonst successfalse bleiben. (Jetzt gibt es keinen Zweifel über Ihre Verwirrung darüber, warum eine Rückkehr wie eine Pause wirkt)

Als eine Randnotiz, ja, ohne mehr Kontext hier, müssen Sie möglicherweise berücksichtigen, dass, wenn die erste connect() ausfällt, dann ist es möglich dass alle nachfolgenden Verbindungen auch werden.