只是试图找出实现此目的的最佳方法。
我的输入字符串通过了几种验证方法:
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;
}
}
对于一个用户,我希望能够抓住String在验证中失败的位置并显示给他们。
在将我的String传递给验证的地方,如果失败,则会抛出异常:
if (validator.validate(input)) {
// execute
} else {
throw new IllegalArgumentException();
}
我是否最好在实际的验证方法中抛出异常以执行此操作?还是有更好的方法?
答案 0 :(得分:2)
要知道验证在哪里失败,您将需要返回某种形式的对象,并返回失败的结果。
我建议创建一个新的例外来做到这一点:
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");