我正在尝试用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”错误?
答案 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.
}