在try catch和if else语句中使用return语句

3
问题在于我的代码内部发生了一些奇怪的事情; 让我们来看我的例子(我稍微清理了一下):
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;
}

有一个小函数被另一个函数调用,我们称之为

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

我发现我的代码中存在逻辑错误后使用了强大的调试器,结果发现了一件有趣的事情。
假设 redirect_url 字符串包含 "statement4" 子字符串,那么第四个 elseif 语句(不包括内部 elseif 语句)将被执行并返回 AUTH_SUCCESS。我是这样想的。
但问题在于,当触发 return AUTH_FAILED 时,下一个指令是在第二个 else if 语句中调用 foo() 函数。我不知道为什么会发生这种情况。太奇怪了。有什么想法吗?
更新1: 类内定义的常量: 示例
private static final int AUTH_SUCCESS      = 4;

更新2 更多代码:

遇到调用函数

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

最后,让我们见识一下病人:
 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;
    }

类似这样的


你的问题目前不太清楚。如果您提供一个最小化、完整化和可重现化的示例,那么帮助您将更加容易。 - Jon Skeet
2
递归调用?你不想要 return foo(); 吗? - Jaroslaw Pawlak
@FishStix,嗯,我当然是从有输入的函数开始的,但后来我发现这些函数经常使用共同的值,所以我把它们放到类字段中。是的,我知道代码很糟糕 :( - Ascelhem
你为什么从一个void函数中返回boolean值? - xenteros
@xenteros 这是一个打字错误 - 它不是实际的代码,而是一个简化的示例。 - Jaroslaw Pawlak
显示剩余3条评论
1个回答

0

在进行递归调用的地方,应该有return foo();

没有return的情况下,它是如何工作的:

  1. 第一次调用该方法
  2. 它进行了递归调用
  3. 递归调用执行并返回一个值,因此我们回到了第一次调用的范围内
  4. 递归调用返回的值被忽略 - 您不会分配或返回它
  5. 执行继续到if语句之外,没有捕获异常,因此它进入您的最后一条语句return AUTH_FAILED;

因此,即使递归调用返回AUTH_SUCCESS,第一次调用也会忽略它并返回AUTH_FAILED


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接