2016-07-21 8 views
3

Das Problem ist, dass etwas seltsames geht in meinem Code; Kommen wir zu meinem Beispiel gehen (ich es ein wenig gereinigt):Return-Anweisung in Versuch fangen und wenn sonst Klausel

public int foo() throws IOException { 
     if(redirect_url.indexOf("statement_1") != -1){ 
      if(check() == true){ 
       //do something 
      }else{ 
       //do something 
       foo(); //yep, recursive call 
      } 
     }else if(redirect_url.indexOf("statement_2") != -1) { 
      map.clear(); 
      bar(); 
      map.put("val", 1); 
      map.put("val2", "2"); 
      foo(); //yep, recursive call; Remember this line!! 
     }else if(redirect_url.indexOf("statement3") != -1) { 
      return AUTH_SUCCESS; 
     }else if(redirect_url.indexOf("statement4") != -1){ 
      return AUTH_SUCCESS; 
     }else { 
      return AUTH_FAILED; 
     } 

    }catch (Exception e){ 
     return AUTH_FAILED; 
    } 
    return AUTH_FAILED; 
} 

Es gibt eine kleine Funktion, die durch eine andere Funktion aufgerufen wird, nennen wir es buzz

public void buzz(){ 
    try { 
     switch (signInAttempt()){ 
      case AUTH_SUCCESS: 
       //do smth 
       return true; 
      case AUTH_FAILED: 
       //do smth 
       return false; 
      case ACCESS_REQUEST: 
        //do smth 
      default: 
       return false; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
} 

Ich habe meine genial ausgepackt Debugger, als ich bemerkte, dass es logische Fehler in meinem Code gab und lustige Dinge herausfand.

Nehmen wir an, dass redirect_url string hat "Statement4" substring, so dass die vierte elseif -Klausel (zählen nicht innere elseif -Klausel) gehen nach innen und zurück AUTH_SUCCESS. Ich dachte auch.

Und hier ist die Probleme, wenn die Rückkehr AUTH_FAILED ausgelöst wird, ruft die nächste Anweisung foo() -Funktion in Second else if-Anweisung. Ich habe keine Ahnung, warum das passieren könnte. So seltsam. Und Ideen?

UPD 1: Konstanten innerhalb der Klasse definiert: Beispiel

private static final int AUTH_SUCCESS  = 4; 

UPD 2 Einige weitere Code:

Meet the calling Funktion

public boolean rollIn(){ 

     try { 
      switch (signInAttempt()){ 
       case AUTH_SUCCESS: 
        //do smth 
       case AUTH_FAILED: 
        return false; 
       case ACCESS_REQUEST: 
        return true; 
       default: 
        return false; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return true; 
    } 

Und endlich mee t die Patienten:

public int signInAttempt() throws IOException { 

     try { 

      /*connection*/ 
      this.doc = connection.parse(); 

      System.out.println(redirect_url); 
      if(redirect_url.indexOf("authorize") != -1){ 
       if(findCaptcha() == true){ 
        signInAttempt(); 
       }else{ 
        authData.clear(); 
        signInAttempt(); 
       } 
      }else if(redirect_url.indexOf("authcheck") != -1) { 
       authData.clear(); 
       authData.put("v1", 1); 
       authData.put("v2", 2); 
       System.out.println(action_url); 
       signInAttempt(); 
      }else if(redirect_url.indexOf("__q_hash") != -1) { 
       System.out.println("AUTH SUCCESS"); 
       return AUTH_SUCCESS; 
      }else if(redirect_url.indexOf("access_token") != -1){ 
       return AUTH_SUCCESS; 
      }else { 
       return AUTH_FAILED; 
      } 

     }catch (Exception e){ 
      return AUTH_FAILED; 
     } 
     return AUTH_FAILED; 
    } 

So etwas wie dieses

+0

Ihre Frage ist im Moment unklar. Es wäre einfacher, dir zu helfen, wenn du ein [mcve] zur Verfügung stellen würdest. –

+0

Ihre Methoden übernehmen keine Eingabe, aber Ihre if-Anweisungen beruhen auf dem aktuellen Status. Es ist schwierig, diese Art von Code zu debuggen. Erwägen Sie, Ihren Code so zu re-factorieren, dass die Methode nur übergebene Argumente verwendet. – FishStix

+2

Rekursive Aufrufe? Willst du 'return foo();' dann? –

Antwort

0

In Orten, wo Sie rekursive Aufrufe zu tun, sollten Sie return foo(); haben.

Eine kurze Erklärung, wie es jetzt funktioniert - ohne return:

  1. das Verfahren wird zum ersten Mal genannt
  2. es einen rekursiven Aufruf so
  3. rekursive ausführt Anruf und gibt einen Wert macht wir sind zurück im Rahmen des ersten Aufrufs
  4. der Wert von rekursiven Aufruf zurückgegeben wird ignoriert - Sie nicht zuweisen oder
  5. zurückgeben
  6. Die Ausführung weiterhin außerhalb der if -Anweisung, nicht abgefangene Ausnahme so geht es um Ihre letzte Aussage return AUTH_FAILED;

Also selbst, wenn rekursive Aufruf AUTH_SUCCESS zurückgegeben, der erste Anruf wird es ignorieren und zurück AUTH_FAILED sowieso.