Это избыточный улов NullPointerException? - PullRequest
2 голосов
/ 08 апреля 2020

Ниже Spring REST-код возвращает список для данного ticketId.

Может ли NullPointerException быть добавлено в этот код?

NullPointerException явно пойман в TicketController:

    catch (NullPointerException nullPointerException) {
        throw new ResponseStatusException(
            HttpStatus.BAD_REQUEST, nullPointerException.getMessage(), nullPointerException);
    }

Возможно, при проверке нуля в билете с идентификатором думали:

        if (ticketId == null) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "ticket id cannot be null");
        }

ожидание это то, что NullPointerException будет выброшено, но вместо этого будет выброшено ResponseStatusException?

Если переменная ticketId является параметром пути, она никогда не может быть нулевой, если попадет в базовый URL / без ticketId Я получаю:

There was an unexpected error (type=Method Not Allowed, status=405).

Весь источник:

@RestController
    public class TicketController {

        private final TicketServiceImpl ticketServiceImpl;

        public TicketController(TicketServiceImpl ticketServiceImpl) {
            this.ticketServiceImpl = ticketServiceImpl;
        }

        @GetMapping(path = "/{ticketId}")
        public ResponseEntity<List<TicketResponse>> getTicketsById(
            @PathVariable("ticketId") final Long ticketId) {
            try {
                final List<TicketResponse> ticketsById = ticketServiceImpl.getAll(ticketId);
                return new ResponseEntity<>(ticketsById, HttpStatus.OK);
            }
            catch (NullPointerException nullPointerException) {
                throw new ResponseStatusException(
                    HttpStatus.BAD_REQUEST, nullPointerException.getMessage(), nullPointerException);
            }
            catch (TicketNotFoundException ticketNotFoundException) {
                throw new ResponseStatusException(
                    HttpStatus.NOT_FOUND, "Ticket id not found",
                    ticketNotFoundException);
            }

        }

    }

@Service
public class TicketServiceImpl implements TicketService {

    private final TicketRepository ticketRepository;

    public TicketServiceImpl(TicketRepository ticketRepository) {

        this.ticketRepository = ticketRepository;

    }

    @Override
    public List<TicketResponse> getAll(Long ticketId) {

        final List<TicketResponse> ticketResponselist = ticketRepository.findData(ticketId);

            if (ticketId == null) {
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "ticket id cannot be null");
            }
            else if (ticketResponselist.size() == 0) {
                throw new TicketNotFoundException("ticket not found");
            }
            else {
                return ticketResponselist;
            }

    }
}

@Repository
public interface TicketRepository {

    public List<TicketResponse> findData(Long ticketId);

}

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

Проверка if (ticketId == null) должна выполняться до вызова ticketRepository.findData(ticketId);.

В противном случае проверка не имеет смысла.

Кроме того, как примечание, перехват NullPointerException это плохая практика. Причина в том, что исключение пустого указателя является главным признаком запаха кода. Код должен быть нулевым, с использованием, например, Необязательно или с соответствующей проверкой на уровне метода. В этом случае это будет на уровне маршрута (который является внешним входом). С этого момента, если проверка установлена, вы имеете дело с ненулевым идентификатором.

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

0 голосов
/ 08 апреля 2020

Проверка NullPointerException в этом случае не требуется.

Примечание: лучше использовать супертип при передаче в качестве параметра метода до тех пор, пока вы не уверены, что вместо вашего исключения не будет выброшено исключение. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...