问题是我的代码中发生了一些奇怪的事情; 让我们看我的例子(我稍微清理了一下):
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();
。
简短解释它现在如何工作 - 没有返回
:
- 第一次调用该方法
- 它进行递归调用
- 递归调用执行并返回一个值,因此我们回到了第一次调用的范围
- 递归调用返回的值将被忽略 - 您不会分配它或返回它
- 执行继续到 if 语句之外,没有捕获异常,因此它会转到最后一个语句
return AUTH_FAILED;
因此,即使递归调用返回 AUTH_SUCCESS
,第一次调用也会忽略它并返回 AUTH_FAILED
。
关于java - try catch 和 if else 子句中的 return 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38514810/