Когда метод имеет тип возвращаемого значения в сигнатуре, что-то должно быть возвращено из метода во всех условиях. И эта проверка выполняется во время компиляции в Java.
Когда вы логически используете if в своем коде, это условие может быть истинным или ложным. Если это правда, метод получит что-то, что возвращается из блока if. Но если условие ложно, метод не получит ничего, чтобы вернуть обратно (потому что код внутри условия if не выполняется). Таким образом, в этом случае методу нужно что-то возвращать по умолчанию, если условие имеет значение false. Из первого метода, если все условия типа
if(si>ei){
return -1;
}
int mid=(si+ei)/2;
if(arr[mid]==x){
return mid;
}
if(arr[mid]>x){
return binarySearch(arr,x,si,mid-1);
}
if(arr[mid]<x){
return binarySearch(arr,x,mid+1,ei);
}
ложны. Метод не сможет ничего вернуть.
В другом месте, когда вы используете else с if (погода это if-else или if-elseIf-else), тогда условие, когда если false (или else if false), часть else вернет что-то из метода. Так что всегда будет что вернуть из метода. Во втором методе, например
if(arr[mid]==x){
return mid;
}
else if(arr[mid]>x){
return binarySearch(arr,x,si,mid-1);
}
else
return binarySearch(arr,x,mid+1,ei);
}
, если первое условие истинно, будет возвращено mid
. Если arr[mid]>x
истинно, возвращается binarySearch(arr,x,si,mid-1);
результат. Если оба верны, то всегда будет что-то вернуть (в вашем случае binarySearch(arr,x,mid+1,ei);
).