Можно ли остановить try catch от возврата null
-
21-12-2019 - |
Вопрос
Если кто-то вызовет мой метод, я хочу защитно разобраться с проблемой.Обычно я просто возвращаюсь null
.
Я решил внедрить try
catch
но, похоже, в конечном итоге я просто возвращаюсь null
в любом случае.
Могу ли я написать свой try
catch
таким образом, чтобы в конце метода он не возвращался null
?
Пример кода, использующий peek
в классе стека.
public T peek()
{
T temp = null;
try
{
temp = array[size];
}
catch(Exception e)
{
}
return temp;
}
При вызове с пустым стеком.Оно вернется null
.
Так стоит ли мне вообще беспокоиться о try
catch
для такого рода дел?Я испытываю искушение сделать это:
if(isEmpty())
return null;
Если стек не пуст, я хочу вернуть элемент.Если стек является пусто, тогда могу ли я избежать возврата null, если я использую try-catch
?
Решение
Метод должен что-то возвращать или генерировать исключение.Если у вас есть неограниченный универсальный тип, то такие вещи, как шаблоны нулевых объектов, использовать нельзя, поэтому параметры возвращаются null
, возвращающий что - то , что содержит T
любить Optional<T>
, или генерирование исключения.
Если вам не нравится безопасность null
, вы можете использовать Optional
, либо из Java 8, либо из библиотеки.Проверенные исключения обладают аналогичной безопасностью, но здесь неуместны.
Другие советы
Вот как бы я подошел к решению проблемы.Создавая исключение в функции peek, возлагая обязанность по обработке этого исключения на вызывающую сторону.Почему?Потому что я хочу, чтобы ошибка вызвала как можно больший взрыв.Метод peek также стал меньше.Кроме того, как вы уже согласились, возвращать null неубедительно.
public T peek() throws IndexOutOfBoundsException
{
return array[size];
}
и
try
{
T top = thestack.peek();
/* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
/* Do something else */
}
Трудно представить себе, что array[size]
генерирует исключение, если только массив не равен null или размер не выходит за пределы длины массива.Итак, вы могли бы сделать что-то вроде этого -
if (array != null && array.length > size) {
return array[size - 1]; // assuming your size starts at 1
}
return null; // need to return something, if not null you need an option type.
Редактировать
Или, используя Вариант монада - и что-то вроде,
if (array != null && array.length > size) {
return new Some<T>(array[size - 1]); // assuming your size starts at 1
}
return new None<T>();