Поэтому я получаю ошибку компилятора, что мне не хватает выражения возврата, и я рассмотрел другие подобные вопросы, но я все еще смущен по этому поводу.
public String pop()
{
try
{
if(top == -1)
{
throw new EmptyStackException("The stack is empty!");
}
String x = stack[top];
top--;
return x;
}
catch (EmptyStackException e)
{
System.out.println("The stack is empty!");
}
}
Я заранее извиняюсь, если этот вопрос задан раньше, но я посмотрел на другие, и я не могу понять этого.
Каково возвращаемое значение pop
если исключение поймано? В этом пути выполнения нет оператора return. Вот почему компилятор жалуется.
В этом случае вызывающий EmptyStackException
pop
должен обрабатывать EmptyStackException
. Не поймайте EmptyStackException
внутри метода pop
. Вам нужно будет объявить, что он throws EmptyStackException
если вы определили его как исключенное исключение. Если вы его не поймаете, тогда метод всегда вернет значение или выбросит исключение, и это удовлетворит компилятор.
Обратите внимание, что можно вернуть значение после блока catch
. Это также удовлетворит компилятор, но что бы вы вернули? Ноль? Затем вызывающий должен проверить значение null
, но вызывающий может также поймать EmptyStackException
.
Ваша проблема связана с определением области охвата
Когда ваша функция работает, она проходит через два условия
- если все пойдет хорошо, что будет tr-блоком, поэтому он вернет String
Ваша проблема находится в состоянии два:
- если все идет не так хорошо, что будет блоком catch, который вы не возвращаете ни одного типа String, а в вашей функции ищет тип String для возврата к вызывающему, но он не может найти, поэтому вы получили ошибку
Как его решить:
Просто верните пустую строку, чтобы указать, что что-то пошло не так.
catch
его перехватил?