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