java-使用类似断言的方法验证输入有效性

java-使用类似断言的方法验证输入有效性,java,validation,assert,Java,Validation,Assert,我有一个标记器,我需要提取每个标记,并将其写入一个输出文件。标记必须以某种逻辑顺序存在(根据语言语法)。因此,我还必须验证令牌顺序是否遵循语法规范。 目前,我正在使用类似断言的方法来实现这一点,这些方法会抛出带有适当消息的异常。 代码如下: public void compileVarDec() throws IOException, IllegalSyntaxException { output.write("<varDec>\n"); verifyStatic

我有一个标记器,我需要提取每个标记,并将其写入一个输出文件。标记必须以某种逻辑顺序存在(根据语言语法)。因此,我还必须验证令牌顺序是否遵循语法规范。 目前,我正在使用类似断言的方法来实现这一点,这些方法会抛出带有适当消息的异常。 代码如下:

public void compileVarDec() throws IOException, IllegalSyntaxException {

    output.write("<varDec>\n");

    verifyStaticField();
    output.write("<keyword> " + tokenizer.keyWord() + " </keyword>\n");
    tokenizer.advance();

    verifyLegalType();
    output.write("<keyword> " + tokenizer.keyWord() + " </keyword>\n");
    tokenizer.advance();

    verifyIdentifier();
    output.write("<identifier> " + tokenizer.identifier() + " </identifier>\n");
    tokenizer.advance();

    verifySymbol(JackTokenizer.SEMI_COLON);
    output.write("<symbol> " + tokenizer.symbol() + " </symbol>\n");
    tokenizer.advance();

    output.write("</varDec>\n");
}

private void verifySymbol(char token) throws IllegalSyntaxException {
    if (tokenizer.tokenType() != JackTokenizer.TOKEN_TYPE.SYMBOL ||
            tokenizer.symbol() != token)
        throw new IllegalSyntaxException("Expected the symbol '" + token + "'");
}

private void verifyStaticField() throws IllegalSyntaxException {
    if (tokenizer.tokenType() != JackTokenizer.TOKEN_TYPE.KEYWORD ||
            (!tokenizer.keyWord().equals(JackTokenizer.FIELD) &&
                    !tokenizer.keyWord().equals(JackTokenizer.STATIC))) {
        throw new IllegalSyntaxException("Expected 'static' or 'field'");
    }
}

private void verifyLegalType() throws IllegalSyntaxException {
    if (tokenizer.tokenType() != JackTokenizer.TOKEN_TYPE.KEYWORD ||
            (!tokenizer.keyWord().equals(JackTokenizer.INT) &&
                    !tokenizer.keyWord().equals(JackTokenizer.CHAR) &&
                    !tokenizer.keyWord().equals(JackTokenizer.BOOLEAN)))
        throw new IllegalSyntaxException("Expected a legal type");
}

private void verifyIdentifier() throws IllegalSyntaxException {
    if (tokenizer.tokenType() != JackTokenizer.TOKEN_TYPE.IDENTIFIER)
        throw new IllegalSyntaxException("Expected an identifier");
}
public void compileVarDec()引发IOException,非法语法异常{
输出。写入(“\n”);
验证静态字段();
output.write(“+tokenizer.keyWord()+”\n”);
tokenizer.advance();
verifyLegalType();
output.write(“+tokenizer.keyWord()+”\n”);
tokenizer.advance();
验证标识符();
output.write(“+tokenizer.identifier()+”\n”);
tokenizer.advance();
验证符号(JackTokenizer.分号);
output.write(“+tokenizer.symbol()+”\n”);
tokenizer.advance();
输出。写入(“\n”);
}
私有void verifySymbol(字符令牌)抛出非法SyntaxException{
if(tokenizer.tokenType()!=JackTokenizer.TOKEN\u TYPE.SYMBOL||
tokenizer.symbol()!=令牌)
抛出新的非法语法异常(“应为符号“'+token+””);
}
private void verifyStaticField()引发非法SyntaxException{
if(tokenizer.tokenType()!=JackTokenizer.TOKEN\u TYPE.KEYWORD||
(!tokenizer.keyWord().equals(JackTokenizer.FIELD)&&
!tokenizer.keyWord().equals(JackTokenizer.STATIC))){
抛出新的非法语法异常(“预期为“静态”或“字段”);
}
}
私有void verifyLegalType()引发非法SyntaxException{
if(tokenizer.tokenType()!=JackTokenizer.TOKEN\u TYPE.KEYWORD||
(!tokenizer.keyWord().equals(JackTokenizer.INT)&&
!tokenizer.keyWord().equals(JackTokenizer.CHAR)&&
!tokenizer.keyWord().equals(JackTokenizer.BOOLEAN)))
抛出新的非法语法例外(“预期为合法类型”);
}
私有void verifyIdentifier()引发非法SyntaxException{
if(tokenizer.tokenType()!=JackTokenizer.TOKEN\u TYPE.IDENTIFIER)
抛出新的非法语法异常(“应为标识符”);
}
以这种方式验证输入是否被视为良好实践?调用一个检查输入的方法,如果该方法无效,将抛出一个异常,而当前方法将忽略抛出的异常并将其传递?
如果你有其他建议,我很高兴听到。注意,我希望避免在令牌上运行两次,因此我必须同时验证输入和写入输出

这很好,但请注意,异常堆栈跟踪将显示它们是在验证方法中抛出的,而不是真正重要的方法中抛出的。另一种方法可能更常见,实践是让被调用的方法执行所有验证,并将实际处理委托给私有方法。谢谢。问题是,我不想对令牌进行两次传递,所以我必须同时验证和写入输出。我会将此添加到问题中这没关系,但是请注意,异常堆栈跟踪将显示它们是在验证方法中抛出的,而不是真正重要的方法。另一种可能更常见的做法是让被调用的方法执行所有验证,并将实际处理委托给私有方法。谢谢。问题是,我不想对令牌进行两次传递,所以我必须同时验证和写入输出。我将把这一点添加到问题中