Вопрос

Если кто-то вызовет мой метод, я хочу защитно разобраться с проблемой.Обычно я просто возвращаюсь 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>(); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top