java - try catch 和 if else 子句中的 return 语句

标签 java try-catch

问题是我的代码中发生了一些奇怪的事情; 让我们看我的例子(我稍微清理了一下):

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

有一个小函数被另一个函数调用,我们称之为 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();
        }
}

当我注意到我的代码中存在逻辑错误并发现有趣的事情时,我打开了我很棒的调试器。

假设redirect_url字符串有“statement4”子字符串,那么第四个elseif子句(不包括内部elseif子句)将进入内部并返回AUTH_SUCCESS。我是这么想的。

问题是,当触发 return AUTH_FAILED 时,下一条指令是在第二个 else if 语句中调用 foo() 函数。我不知道为什么会发生这种情况。这么奇怪。和想法?

UPD 1: 类内部定义的常量: 示例

private static final int AUTH_SUCCESS      = 4;

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

类似这样的事情

最佳答案

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

简短解释它现在如何工作 - 没有返回:

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

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

关于java - try catch 和 if else 子句中的 return 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38514810/

相关文章:

java - 使用 JCE/JCA 从主 key 派生 secret

java - 使用 FormLayout 批量重绘 Swing 组件

TSQL 使用事务创建触发器并 try catch block

java - 无法访问的代码编译没有错误 - 如何?

java - 如何在循环中创建 try block ?

Java : PDF page preview error, 预期外部参照

java - 正则表达式 foo_bar_number 为 2 个字符串 [foo_bar, number]?

java - 显示异常原因

c++ - 我可以在 qt Creator 中使用带有 try catch 语句的断点吗?

c++ - 多个字符串异常处理