Почему компилятор не выдает ошибку «Нет оператора возврата»? - PullRequest
0 голосов
/ 07 октября 2018

Я пытался решить вопрос в Leetcode, и одним из обсуждаемых решений было следующее:

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

Разве компилятор не должен выдавать «Нет возврата»здесь ошибка?

Ответы [ 4 ]

0 голосов
/ 07 октября 2018

Ваши оба цикла for бесконечны, второй обрывается или возвращается когда-нибудь!но первый даже не имеет разрыва, тогда Java знает, что вы никогда не разбогатеете до последней строки.

 for (int i = 0; ; i++) {
      //Your second loop which is capable of returning or breaking (the second one is not technically infinite.
 }
0 голосов
/ 07 октября 2018

Первый цикл for бесконечен для компилятора, мы знаем, что он вернется, но у компилятора нет причин жаловаться.Хороший вопрос, хотя.

0 голосов
/ 07 октября 2018
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 значение, поэтому компилятору нет причин жаловаться.

0 голосов
/ 07 октября 2018

это потому, что вы не указываете угловые значения для счетчиков цикла.если вы добавите что-то вроде i<N; или j<N;, вы получите предупреждение компилятора.Но до этого это так же, как:

while (true) {

} 
...