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

Java try-catch和if-else子句中的return语句,java,try-catch,Java,Try Catch,问题是在我的代码中发生了一些奇怪的事情; 让我们来看我的例子(我把它清理了一点): 有一个小函数被另一个函数调用,我们称它为buzz public void buzz(){ try { switch (signInAttempt()){ case AUTH_SUCCESS: //do smth return true; case AUTH_FAILE

问题是在我的代码中发生了一些奇怪的事情; 让我们来看我的例子(我把它清理了一点):

有一个小函数被另一个函数调用,我们称它为
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。我想是的

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

UPD 1: 类中定义的常量: 范例

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

简要说明它现在是如何工作的-不带
返回

  • 该方法第一次被调用
  • 它进行递归调用
  • 递归调用执行并返回一个值,因此我们回到第一个调用的范围
  • 递归调用返回的值被忽略-您不分配或返回它
  • 执行继续在if语句之外,没有捕获到异常,因此它转到上一个语句
    return AUTH_FAILED

  • 因此,即使递归调用返回了
    AUTH\u SUCCESS
    ,第一个调用也会忽略它并返回
    AUTH\u FAILED

    您的问题目前还不清楚。如果你能提供一个新的方法,你会更容易得到帮助。你的方法不接受任何输入,但是你的if语句依赖于当前的状态。调试这种类型的代码很困难。考虑重构代码,使该方法只使用传入的参数。递归调用?你不想
    返回foo()
    then?@FishStix,我当然是从有输入的函数开始的,但后来我发现这些函数通常使用公共值,我将其放入类字段中。是的,我明白代码是多么的糟糕:(@JaroslawPawlak,好吧,我这么做了,它解决了我的问题。你应该把这个作为一个答案,我也需要一点解释。
    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;
        }