为啥编译器无法识别我的 return 语句?

Posted

技术标签:

【中文标题】为啥编译器无法识别我的 return 语句?【英文标题】:Why does the compiler not recognize my return statements?为什么编译器无法识别我的 return 语句? 【发布时间】:2019-03-20 08:42:27 【问题描述】:

我有以下代码块:

public static boolean isReverse (String s1, String s2)     
    if((s1.length()==1)&&s2.length()==1)           
        if(s1.equals(s2))              
            return true;
        
           
    else if(s1.charAt(0)==s2.charAt(s2.length()-1))            
        return isReverse(s1.substring(1, s1.length()-1),s2.substring(0, s2.length()-2));
           
    else return false;  

我了解通常您需要一个 return 语句来涵盖所有 if 语句都不为真的可能性。这就是为什么我最后有else return false,但我仍然收到错误“必须返回布尔类型的结果”。这是我正在使用它的调用:

public static void main(String[] args) 
    if(isReverse("Java", "avaJ")) 
        System.out.println("worked");
    

【问题讨论】:

else return false 更改为return false。由于else,您缺少返回路径 【参考方案1】:

在第一个if有可能不会有return语句:

if((s1.length()==1)&&s2.length()==1) 
    //What if this is not true?
    if(s1.equals(s2)) 
        return true;
    

在此块中,如果s1 不等于s2,那么它将跳出if,并且由于最后一个return false; 链接到else 块,它将到达方法的末尾没有任何回报。

要解决此问题而不是 else return false,只需 return false;

【讨论】:

【参考方案2】:

第一个 if 有一个嵌套的 if 条件,这会导致您不返回任何内容的分支。您可以删除最后一个 else 并默认设置为 return false;。或者简单地将嵌套的if 修改为 return 本身。也就是改这个

if((s1.length()==1)&&s2.length()==1) 
    if(s1.equals(s2)) 
        return true;
    

to just (re-indented and suprafous parens removes)

if (s1.length() == 1 && s2.length() == 1) 
    return s1.equals(s2);

我们还可以在一行中使用StringBuilder 重新实现该方法,例如

public static boolean isReverse(String s1, String s2) 
    return new StringBuilder(s1).reverse().toString().equals(s2);

【讨论】:

【参考方案3】:
public static boolean isReverse (String s1, String s2)     
    if(s1.length()==1&&s2.length()==1)           
        if(s1.equals(s2))              
            return true;
         else 
            return false; // This portion need to be return some result.
        
           
    else if(s1.charAt(0)==s2.charAt(s2.length()-1))            
        return isReverse(s1.substring(1, s1.length()-1),s2.substring(0, s2.length()-2));
           
    else return false;  

或者

public static boolean isReverse (String s1, String s2)     
    if(s1.length()==1&&s2.length()==1)           
        if(s1.equals(s2))              
            return true;
        
           
    else if(s1.charAt(0)==s2.charAt(s2.length()-1))            
        return isReverse(s1.substring(1, s1.length()-1),s2.substring(0, s2.length()-2));
           
    return false;  // Just return the result without else

【讨论】:

以上是关于为啥编译器无法识别我的 return 语句?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 会出现“无法访问的语句”编译器错误?

为啥 Javascript 无法识别我的构造函数?

安装了jdk ,配置了环境变量,都正确,为啥无法识别Java文件?

为啥 Tesseract OCR 库(iOS)根本无法识别文本?

.mm 文件中无法识别的预编译头文件中的#define

为啥 SQL Server 无法识别,即使我有对 DAL05.dll 的引用?