Задать вопрос
@n199a
Java

Как правильно обработать Unhandled exception?

Есть у меня класс, в котором есть метод, который принимает строку и парсит её с помощью стримов в массив типа double, который выбрасывает исключение типа неверного формата данных:

Класс-парсер

public double[] parseString (String dataString) throws QuadrangleException {
        String withoutCommas = dataString.
                replace(REGEX_COMMA, REGEX_SPACE)
                .trim();

        double[] parseData;

        try {
            parseData = Arrays.stream(withoutCommas.split(REGEX_SEPARATOR))
                    .mapToDouble(Double::parseDouble)
                    .toArray();
        } catch (NumberFormatException ex) {
            LOGGER.log(Level.ERROR, "Incorrect input data", ex);
            throw new QuadrangleException("Incorrect input data " + ex);
        }

        LOGGER.log(Level.INFO, "From string \"{}\" turned out an array: {}", dataString, Arrays.toString(parseData));

        return parseData;
    }



Тут всё понятно. И вот наступает момент использования метода parseString() одного класса (код приведен выше) внутри другого метода с помощью стрима вот так:
Нажми, чтобы посмотреть код

@Override
    public List<Quadrangle> createQuadrangleFromGroupPoints (List<String> allGroupsPoint) {
        DataParser dataParser = new DataParser();

        List<Quadrangle> quadrangles = allGroupsPoint.stream()
                .map(dataParser::parseString)
                .map(this::convertToListPoint)
                .map(p -> new Quadrangle(p.get(0), p.get(1), p.get(2), p.get(3)))
                .collect(Collectors.toList());

        LOGGER.log(Level.INFO, "Was created {} quadrangles.", quadrangles.size());

        return quadrangles;
    }

// вот метод convertToListPoint
private List<Point> convertToListPoint (double[] doubleDigits) {
        int positionX;
        int positionY;
        List<Point> listPoints = new ArrayList<>();

        for (int i = 0; i < POINTS_IN_QUADRANGLE; i++) {
            positionX = i * 2;
            positionY = positionX + 1;
            listPoints.add(new Point(doubleDigits[positionX], doubleDigits[positionY]));
        }

        LOGGER.log(Level.INFO, "From {} digits was created {} points.", doubleDigits, listPoints.size());

        return listPoints;
    }



И вот на этой строке .map(dataParser::parseString) в стриме мне показывает, что у меня имеется необработанное исключение. Ок, как его правильно обработать? Добавить throws к методу - это не решение. Тогда как? Можно ли как-то использовать этот стрим или его нужно будет заменить?
  • Вопрос задан
  • 213 просмотров
Подписаться 1 Простой 10 комментариев
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Бизнес-логику на исключениях делать не надо. Заведи класс Result, сделай двух наследников, в одном массив даблов, другой - маркер ошибки. В правильном месте обрабатывай. Checked exceptions всё, можешь забыть про них. Никогда не используй в своём коде.
Ответ написан
xez
@xez Куратор тега Java
TL Junior Roo
Используйте @SneakyThrows из lombok https://projectlombok.org/features/SneakyThrows
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы