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
Ihre Frage ist im Moment unklar. Es wäre einfacher, dir zu helfen, wenn du ein [mcve] zur Verfügung stellen würdest. –
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
Rekursive Aufrufe? Willst du 'return foo();' dann? –