为何编译器没有抛出“ No return statement”错误?

时间:2018-10-07 19:11:06

标签: java return

我正在尝试用Leetcode解决question,下面讨论的解决方案之一是:

public class Solve {
    public static void main(String[] args) {
        String haystack = "mississippi";
        String needle = "issip";
        System.out.println(strStr(haystack,needle)) ;
    }

    public static int strStr(String haystack, String needle) {
        for (int i = 0; ; i++) {
            for (int j = 0; ; j++) {
                if (j == needle.length()) return i;
                if (i + j == haystack.length()) return -1;
                if (needle.charAt(j) != haystack.charAt(i + j)) break;
            }
        }
    }
}

编译器是否应该在此处引发“ No return statement”错误?

4 个答案:

答案 0 :(得分:2)

for (int i = 0; ; i++) {
    for (int j = 0; ; j++) {
       if (j == needle.length()) return i;
       if (i + j == haystack.length()) return -1;
       if (needle.charAt(j) != haystack.charAt(i + j)) break;
    }
}

这两个for循环都是无限循环。 break语句仅跳出内部for循环。因此,除了for语句外,外部return循环没有退出条件。该方法没有return值的路径,因此编译器没有理由抱怨。

答案 1 :(得分:1)

这是因为您没有为循环计数器指定转角值。 如果添加i<N;j<N;之类的代码,则会收到编译器警告。 但是直到那为止:

while (true) {

} 

答案 2 :(得分:1)

第一个for循环对于编译器而言是无限的,我们知道它将返回,但是编译器没有理由抱怨。不过好问题。

答案 3 :(得分:0)

您的两个for循环都是无限的,第二个循环总有一天会中断或返回!但是第一个甚至没有休息,然后Java知道你永远不会富有到最后一行。

 for (int i = 0; ; i++) {
      //Your second loop which is capable of returning or breaking (the second one is not technically infinite.
 }