Не удалось найти место в проверке строки - PullRequest
0 голосов
/ 02 октября 2018

Просто пытаюсь найти лучший способ сделать это.

У меня есть несколько методов проверки, через которые проходит моя строка ввода:

public class Validator {

    private static final String VALID_INFIX_REGEX = "^[0-9(]([\\s0-9+*/()-])*[0-9)]$";

    public boolean validate(String input) {
        return (isValidInfixExpression(input) && hasBalancedParenthesis(input) && checkIfOperatorsAppearConsecutively(input));
    }

    private boolean isValidInfixExpression(String input) {

        final Pattern pattern = Pattern.compile(VALID_INFIX_REGEX);
        final Matcher matcher = pattern.matcher(input);

        return matcher.matches();
    }

    private boolean hasBalancedParenthesis(String input) {

        String[] tokens = input.split("\\s");

        int unclosedParenthesis = 0;
        for (int i = 0; i < tokens.length; i++) {

            if ("(".equals(tokens[i])) {
                unclosedParenthesis++;
            } else if (")".equals(tokens[i])) {
                unclosedParenthesis--;
            }
        }
        return (unclosedParenthesis == 0);
    }

    private boolean checkIfOperatorsAppearConsecutively(String input) {

        String[] tokens = input.split("\\s");

        for (int i = 0; i < tokens.length; i++) {
            if (Operator.isOperator(tokens[i])) {

                if ("(".equals(tokens[i - 1]) || ")".equals(tokens[i + 1]) || Operator.isOperator(tokens[i + 1])) {
                    return false;
                }
            }
        }
        return true;
    }
}

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

Когда я передаю свою строку в проверку, я выдаю исключение в случае неудачи:

if (validator.validate(input)) {
    // execute
} else {
    throw new IllegalArgumentException();
}

Мне лучше броситьисключения в реальных методах валидации, чтобы сделать это, или есть лучший способ?

1 Ответ

0 голосов
/ 02 октября 2018

Чтобы узнать, где проверка не удалась, вам нужно вернуть обратно некоторую форму объекта, в результате чего он не прошел.

Я рекомендую создать новое исключение для этого:

public class InvalidInputException extends IllegalArgumentException {

    private int errorIndex;

    public InvalidInputException(String message) {
        super(message);
    }

    public InvalidInputException(String message, int index) { 
         super("Invalid Input at index: " + index + " " + message);
         errorIndex = index;
    }

    public int getErrorIndex() { return errorIndex; }
}

Затем вы можете адаптировать свои методы валидации к обнаруженным ошибкам валидации и включить их в исключение.Например,

throw new InvalidInputException("Missing closing parenthesis", 200);

или

throw new InvalidInputException("Invalid format");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...